interactive-react-inspector 1.0.0 → 1.1.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/README.md +13 -16
- package/dist/chunk-RY62FD45.js +5 -0
- package/dist/chunk-RY62FD45.js.map +1 -0
- package/dist/chunk-VI6QGAEY.js +6 -0
- package/dist/chunk-VI6QGAEY.js.map +1 -0
- package/dist/index.cjs +7 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -2
- package/dist/index.d.ts +21 -2
- package/dist/index.js +1 -1
- package/dist/loader.cjs +6 -0
- package/dist/loader.cjs.map +1 -0
- package/dist/loader.d.cts +13 -0
- package/dist/loader.d.ts +13 -0
- package/dist/loader.js +2 -0
- package/dist/loader.js.map +1 -0
- package/dist/runtime.cjs +2 -2
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.js +2 -2
- package/dist/runtime.js.map +1 -1
- package/dist/vite.cjs +7 -4
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.cts +1 -1
- package/dist/vite.d.ts +1 -1
- package/dist/vite.js +1 -1
- package/package.json +27 -7
- package/dist/chunk-EJKHJJ5M.js +0 -6
- package/dist/chunk-EJKHJJ5M.js.map +0 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Inspired by [webfansplz/vite-plugin-vue-inspector](https://github.com/webfansplz
|
|
|
7
7
|
## Features
|
|
8
8
|
- Inspect React components directly in the browser.
|
|
9
9
|
- Click to jump to the exact source code line in your editor.
|
|
10
|
-
- Cross-framework support for Vite and Next.js.
|
|
10
|
+
- Cross-framework support for Vite and Next.js (Webpack & Turbopack).
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
@@ -34,32 +34,29 @@ export default defineConfig({
|
|
|
34
34
|
|
|
35
35
|
### Next.js
|
|
36
36
|
|
|
37
|
-
|
|
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`:
|
|
37
|
+
Add the Next.js integration to your `next.config.ts`:
|
|
41
38
|
|
|
42
39
|
```ts
|
|
43
40
|
import Inspector from 'interactive-react-inspector'
|
|
44
41
|
|
|
45
|
-
const nextConfig = {
|
|
46
|
-
webpack(config) {
|
|
47
|
-
config.plugins.push(
|
|
48
|
-
Inspector.webpack(),
|
|
49
|
-
)
|
|
50
|
-
return config
|
|
51
|
-
},
|
|
52
|
-
}
|
|
42
|
+
const nextConfig = {}
|
|
53
43
|
|
|
54
|
-
export default nextConfig
|
|
44
|
+
export default Inspector.next(nextConfig)
|
|
55
45
|
```
|
|
56
46
|
|
|
57
|
-
|
|
47
|
+
This configures Turbopack rules for `next dev --turbopack` and `next build --turbopack`, while keeping Webpack support for projects that still run `next dev --webpack`.
|
|
48
|
+
|
|
49
|
+
The inspector instruments development builds only. Production Next.js builds are supported and complete without inspector metadata being added.
|
|
50
|
+
|
|
51
|
+
You can try the Turbopack playground in this repository:
|
|
58
52
|
|
|
59
53
|
```bash
|
|
60
|
-
next dev
|
|
54
|
+
pnpm --dir playgrounds/next-turbopack dev
|
|
55
|
+
pnpm --dir playgrounds/next-turbopack build
|
|
61
56
|
```
|
|
62
57
|
|
|
63
58
|
## License
|
|
64
59
|
MIT
|
|
65
60
|
|
|
61
|
+
## Disclaimer
|
|
62
|
+
This project was created with the help of AI. Contributions and feedback are welcome to improve the project further.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{a as d,b as m}from"./chunk-VI6QGAEY.js";import{createUnplugin as x}from"unplugin";import c from"path";import{fileURLToPath as C}from"url";import w from"launch-editor";import S from"http";import T from"fs";var f="virtual:react-inspector",y="\0"+f,_=/\.(mjs|js|jsx|ts|tsx)$/,A=/\/(node_modules|dist|build|coverage|\.next|\.nuxt|\.svelte-kit|\.output|\.astro)\//;function u(t){return t?t.split("?")[0].split("#")[0].replace(/\\/g,"/"):""}var E=typeof __filename=="string"?__filename:C(import.meta.url),p=c.dirname(E),g=u(T.existsSync(c.resolve(p,"../runtime/install.ts"))?c.resolve(p,"../runtime/install.ts"):c.resolve(p,"./runtime.js"));function O(t,n){let e=t.split(/\r?\n/),r=!1;for(let o of e){let i=o.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 k(t){return O(t,"use client")}function I(t){if(!t)return!1;let n=u(t);return A.test(n)||n.includes("\0")?!1:_.test(n)}function P(t){return/from\s+["']react-dom\/client["']/.test(t)||/require\(\s*["']react-dom\/client["']\s*\)/.test(t)}function W(t){let r=(u(t).split("/").pop()??"").replace(_,"");return["main","index","app","_app","root","client","entry-client","entry.client"].includes(r)}function $(t,n,e){if(!t)return!1;let r=u(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")?k(n):k(n)||P(n)||W(r)}function b(t){return t.framework==="vite"?`/@fs/${g}`:g}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 v(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 o=typeof r=="function"?await r():r;return typeof o=="string"||Array.isArray(o)?l(o,n):o&&typeof o=="object"?Object.fromEntries(Object.entries(o).map(([i,s])=>[i,l(s,n)])):o}}function h(t){t.use("/__open",(n,e)=>{let r="";n.on("data",o=>r+=o),n.on("end",()=>{try{let{file:o,line:i,column:s}=JSON.parse(r);w(`${o}:${i}:${s}`),e.statusCode=204,e.end()}catch{e.statusCode=400,e.end()}})})}var a=null;function N(){return a||(a=new Promise(t=>{let n=S.createServer((e,r)=>{if(e.url==="/__open"&&e.method==="POST"){let o="";e.on("data",i=>o+=i),e.on("end",()=>{try{let{file:i,line:s,column:R}=JSON.parse(o);w(`${i}:${s}:${R}`),r.statusCode=204,r.end()}catch{r.statusCode=400,r.end()}})}else r.statusCode=404,r.end()});n.listen(0,"127.0.0.1",()=>{let e=n.address().port;t(e)})}),a)}function D(t){let n=t.options.devServer;if(!n||typeof n!="object")return;let e=n.setupMiddlewares;n.setupMiddlewares=(r,o)=>(o.app&&h(o.app),typeof e=="function"?e(r,o):r)}var L=["*.mjs","*.js","*.jsx","*.ts","*.tsx"],U="interactive-react-inspector/loader";function z(t,n){return Array.isArray(t)?[...t,n]:t?[t,n]:n}function B(t){return t!=="*.js"?{not:"foreign"}:{all:[{not:"foreign"},{path:/\.js$/},{not:{path:/\.(?:jsx|ts|tsx)\.js$/}}]}}function M(t={}){let n={...t};for(let e of L)n[e]=z(n[e],{condition:B(e),loaders:[{loader:U,options:{runtime:!0}}]});return n}var j=x((t,n)=>({name:"react-inspector",enforce:"pre",resolveId(e){if(e===f)return y},load(e){if(e===y)return`
|
|
2
|
+
"use client";
|
|
3
|
+
import ${JSON.stringify(b(n))};
|
|
4
|
+
`},transform(e,r){if(!I(r))return;let o=m(e,r);return $(r,e,n.framework)&&o&&(o.code=d(o.code,f)),o},vite:{configureServer(e){h(e.middlewares)}},webpack(e){v(e,b(n)),D(e)}}));function J(t={}){let n=t.webpack;return{...t,turbopack:{...t.turbopack,rules:M(t.turbopack?.rules)},async rewrites(){let e=await N(),r=typeof t.rewrites=="function"?await t.rewrites():t.rewrites,o={source:"/__open",destination:`http://127.0.0.1:${e}/__open`};return Array.isArray(r)?[...r,o]:r&&typeof r=="object"?{...r,fallback:[...r.fallback||[],o]}:[o]},webpack(e,r){let o=typeof n=="function"?n(e,r)??e:e;return o.plugins??=[],o.plugins.push(j.webpack()),o}}}var Z=Object.assign(j,{next:J});export{J as a,Z as b};
|
|
5
|
+
//# sourceMappingURL=chunk-RY62FD45.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/unplugin/index.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\nimport http from \"node:http\";\r\nimport type { AddressInfo } from \"node:net\";\r\n\r\nimport fs from \"node:fs\";\n\nimport { injectSideEffectImport } from \"../core/imports.ts\";\nimport { transform as sourceTransform } from \"../core/transform.ts\";\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 currentFile = typeof __filename === \"string\"\n ? __filename\n : fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(currentFile);\nconst RUNTIME_PATH = normalizeId(\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\nlet bridgePortPromise: Promise<number> | null = null;\r\n\r\nfunction getBridgeServerPort() {\r\n if (bridgePortPromise) return bridgePortPromise;\r\n\r\n bridgePortPromise = new Promise((resolve) => {\r\n const server = http.createServer((req, res) => {\r\n if (req.url === \"/__open\" && req.method === \"POST\") {\r\n let body = \"\";\r\n req.on(\"data\", (chunk) => (body += chunk));\r\n req.on(\"end\", () => {\r\n try {\r\n const { file, line, column } = JSON.parse(body);\r\n launch(`${file}:${line}:${column}`);\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 } else {\r\n res.statusCode = 404;\r\n res.end();\r\n }\r\n });\r\n\r\n server.listen(0, \"127.0.0.1\", () => {\r\n const port = (server.address() as AddressInfo).port;\r\n resolve(port);\r\n });\r\n });\r\n\r\n return bridgePortPromise;\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\ntype NextConfigLike = Record<string, any> & {\r\n turbopack?: Record<string, any> & {\r\n rules?: Record<string, any>;\r\n };\r\n webpack?: ((config: any, context: any) => any) | null;\r\n rewrites?: (() => Promise<any> | any) | any;\r\n};\n\nconst TURBOPACK_EXTENSIONS = [\"*.mjs\", \"*.js\", \"*.jsx\", \"*.ts\", \"*.tsx\"];\nconst TURBOPACK_LOADER = \"interactive-react-inspector/loader\";\n\nfunction appendTurbopackRule(existing: unknown, rule: unknown) {\n return Array.isArray(existing)\n ? [...existing, rule]\n : existing\n ? [existing, rule]\n : rule;\n}\n\nfunction getTurbopackCondition(extension: string) {\n if (extension !== \"*.js\") return { not: \"foreign\" };\n\n return {\n all: [\n { not: \"foreign\" },\n { path: /\\.js$/ },\n { not: { path: /\\.(?:jsx|ts|tsx)\\.js$/ } },\n ],\n };\n}\n\nfunction createTurbopackRules(existingRules: Record<string, any> = {}) {\n const rules = { ...existingRules };\n\n for (const extension of TURBOPACK_EXTENSIONS) {\n rules[extension] = appendTurbopackRule(rules[extension], {\n condition: getTurbopackCondition(extension),\n loaders: [\n {\n loader: TURBOPACK_LOADER,\n options: { runtime: true },\n },\n ],\n });\n }\n\n return rules;\n}\n\nconst Inspector = createUnplugin((_options, meta) => ({\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 = injectSideEffectImport(result.code, VIRTUAL_ID);\n }\n\n return result;\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}));\n\nfunction next<TConfig extends NextConfigLike>(config: TConfig = {} as TConfig) {\r\n const originalWebpack = config.webpack;\r\n\r\n return {\r\n ...config,\r\n turbopack: {\r\n ...config.turbopack,\r\n rules: createTurbopackRules(config.turbopack?.rules),\r\n },\r\n async rewrites() {\r\n const bridgePort = await getBridgeServerPort();\r\n const originalRewrites = typeof config.rewrites === \"function\"\r\n ? await config.rewrites()\r\n : config.rewrites;\r\n\r\n const inspectorRewrite = {\r\n source: \"/__open\",\r\n destination: `http://127.0.0.1:${bridgePort}/__open`,\r\n };\r\n\r\n if (Array.isArray(originalRewrites)) {\r\n return [...originalRewrites, inspectorRewrite];\r\n } else if (originalRewrites && typeof originalRewrites === \"object\") {\r\n return {\r\n ...originalRewrites,\r\n fallback: [...(originalRewrites.fallback || []), inspectorRewrite],\r\n };\r\n }\r\n\r\n return [inspectorRewrite];\r\n },\r\n webpack(webpackConfig: any, context: any) {\r\n const nextWebpackConfig = typeof originalWebpack === \"function\"\r\n ? originalWebpack(webpackConfig, context) ?? webpackConfig\r\n : webpackConfig;\r\n\r\n nextWebpackConfig.plugins ??= [];\r\n nextWebpackConfig.plugins.push(Inspector.webpack());\r\n\r\n return nextWebpackConfig;\r\n },\r\n };\r\n}\n\nexport { next };\n\nexport default Object.assign(Inspector, { next });\n"],"mappings":"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","names":["createUnplugin","path","fileURLToPath","launch","http","fs","VIRTUAL_ID","RESOLVED_ID","SOURCE_EXT_RE","IGNORED_PATH_RE","normalizeId","id","currentFile","fileURLToPath","__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","bridgePortPromise","getBridgeServerPort","resolve","server","http","chunk","port","injectWebpackDevServerOpenRoute","devServer","originalSetupMiddlewares","middlewares","TURBOPACK_EXTENSIONS","TURBOPACK_LOADER","appendTurbopackRule","existing","rule","getTurbopackCondition","extension","createTurbopackRules","existingRules","rules","Inspector","createUnplugin","_options","result","transform","injectSideEffectImport","next","config","originalWebpack","bridgePort","originalRewrites","inspectorRewrite","webpackConfig","context","nextWebpackConfig","unplugin_default","Inspector","next"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
function d(t){let n=0,r=0;if(t.startsWith("#!")){let e=t.indexOf(`
|
|
2
|
+
`);n=e===-1?t.length:e+1,r=n}for(;n<t.length;){let e=t.indexOf(`
|
|
3
|
+
`,n),i=e===-1?t.length:e+1,o=t.slice(n,i).trim();if(!o||o.startsWith("//")){n=i;continue}if(o.startsWith("/*")){let s=t.indexOf("*/",n+2);n=s===-1?t.length:s+2,t[n]==="\r"&&(n+=1),t[n]===`
|
|
4
|
+
`&&(n+=1);continue}if(/^(['"])(.*?)\1;?$/.test(o)){r=i,n=i;continue}break}return r}function S(t,n){let r=`import ${JSON.stringify(n)};`;if(t.includes(r))return t;let e=d(t);return`${t.slice(0,e)}${r}
|
|
5
|
+
${t.slice(e)}`}import h from"path";import{parse as y}from"@babel/parser";import f from"@babel/traverse";import x from"magic-string";var $=f.default||f,c="data-source";function u(t){return t.split("?")[0].split("#")[0].replace(/\\/g,"/")}function v(t){return/\.(mjs|js|jsx|ts|tsx)$/.test(u(t))}function E(t){if(t.type!=="JSXIdentifier")return!1;let n=t.name;return/^[a-z]/.test(n)||n==="Image"||n==="Link"}function P(t,n){if(process.env.NODE_ENV==="production")return;let r=u(n);if(!v(r))return null;let e=new x(t),i;try{i=y(t,{sourceType:"unambiguous",plugins:["jsx","typescript","decorators-legacy","classProperties","classPrivateProperties","classPrivateMethods","importAttributes"]})}catch{return null}let a=h.relative(process.cwd(),r).replaceAll("\\","/");return $(i,{JSXOpeningElement(o){let s=o.node;if(!s.loc||!E(s.name)||s.attributes.some(l=>l.type==="JSXAttribute"&&l.name.name===c))return;let m=s.end-(s.selfClosing?2:1),{line:p,column:g}=s.loc.start;e.prependLeft(m,` ${c}="${a}:${p}:${g}"`)}}),{code:e.toString(),map:e.generateMap()}}export{S as a,P as b};
|
|
6
|
+
//# sourceMappingURL=chunk-VI6QGAEY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/imports.ts","../src/core/transform.ts"],"sourcesContent":["function getDirectiveInsertOffset(code: string) {\n let offset = 0;\n let insertOffset = 0;\n\n if (code.startsWith(\"#!\")) {\n const lineEnd = code.indexOf(\"\\n\");\n offset = lineEnd === -1 ? code.length : lineEnd + 1;\n insertOffset = offset;\n }\n\n while (offset < code.length) {\n const lineEnd = code.indexOf(\"\\n\", offset);\n const end = lineEnd === -1 ? code.length : lineEnd + 1;\n const line = code.slice(offset, end);\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith(\"//\")) {\n offset = end;\n continue;\n }\n\n if (trimmed.startsWith(\"/*\")) {\n const blockEnd = code.indexOf(\"*/\", offset + 2);\n offset = blockEnd === -1 ? code.length : blockEnd + 2;\n if (code[offset] === \"\\r\") offset += 1;\n if (code[offset] === \"\\n\") offset += 1;\n continue;\n }\n\n if (/^(['\"])(.*?)\\1;?$/.test(trimmed)) {\n insertOffset = end;\n offset = end;\n continue;\n }\n\n break;\n }\n\n return insertOffset;\n}\n\nexport function injectSideEffectImport(code: string, id: string) {\n const statement = `import ${JSON.stringify(id)};`;\n\n if (code.includes(statement)) return code;\n\n const offset = getDirectiveInsertOffset(code);\n\n return `${code.slice(0, offset)}${statement}\\n${code.slice(offset)}`;\n}\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 isInspectableElement(name: any) {\r\n if (name.type !== \"JSXIdentifier\") return false;\r\n const nameStr = name.name;\r\n return /^[a-z]/.test(nameStr) || nameStr === \"Image\" || nameStr === \"Link\";\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 (!isInspectableElement(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":["getDirectiveInsertOffset","code","offset","insertOffset","lineEnd","end","trimmed","blockEnd","injectSideEffectImport","id","statement","path","parse","_traverse","MagicString","traverse","ATTR","normalizeId","id","shouldTransform","isInspectableElement","name","nameStr","transform","code","normalizedId","s","ast","relative","p","node","a","insert","line","column"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var J=Object.create;var f=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var V=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var K=(t,n)=>{for(var e in n)f(t,e,{get:n[e],enumerable:!0})},k=(t,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of X(n))!H.call(t,s)&&s!==e&&f(t,s,{get:()=>n[s],enumerable:!(r=B(n,s))||r.enumerable});return t};var c=(t,n,e)=>(e=t!=null?J(V(t)):{},k(n||!t||!t.__esModule?f(e,"default",{value:t,enumerable:!0}):e,t)),F=t=>k(f({},"__esModule",{value:!0}),t);var gt={};K(gt,{default:()=>dt,next:()=>L});module.exports=F(gt);var A=require("unplugin"),u=c(require("path"),1),C=require("url"),h=c(require("launch-editor"),1),v=c(require("http"),1),P=c(require("fs"),1);function G(t){let n=0,e=0;if(t.startsWith("#!")){let r=t.indexOf(`
|
|
2
|
+
`);n=r===-1?t.length:r+1,e=n}for(;n<t.length;){let r=t.indexOf(`
|
|
3
|
+
`,n),s=r===-1?t.length:r+1,o=t.slice(n,s).trim();if(!o||o.startsWith("//")){n=s;continue}if(o.startsWith("/*")){let a=t.indexOf("*/",n+2);n=a===-1?t.length:a+2,t[n]==="\r"&&(n+=1),t[n]===`
|
|
4
|
+
`&&(n+=1);continue}if(/^(['"])(.*?)\1;?$/.test(o)){e=s,n=s;continue}break}return e}function w(t,n){let e=`import ${JSON.stringify(n)};`;if(t.includes(e))return t;let r=G(t);return`${t.slice(0,r)}${e}
|
|
5
|
+
${t.slice(r)}`}var j=c(require("path"),1),_=require("@babel/parser"),m=c(require("@babel/traverse"),1),S=c(require("magic-string"),1),Q=m.default.default||m.default,x="data-source";function E(t){return t.split("?")[0].split("#")[0].replace(/\\/g,"/")}function Y(t){return/\.(mjs|js|jsx|ts|tsx)$/.test(E(t))}function Z(t){if(t.type!=="JSXIdentifier")return!1;let n=t.name;return/^[a-z]/.test(n)||n==="Image"||n==="Link"}function O(t,n){if(process.env.NODE_ENV==="production")return;let e=E(n);if(!Y(e))return null;let r=new S.default(t),s;try{s=(0,_.parse)(t,{sourceType:"unambiguous",plugins:["jsx","typescript","decorators-legacy","classProperties","classPrivateProperties","classPrivateMethods","importAttributes"]})}catch{return null}let i=j.default.relative(process.cwd(),e).replaceAll("\\","/");return Q(s,{JSXOpeningElement(o){let a=o.node;if(!a.loc||!Z(a.name)||a.attributes.some(b=>b.type==="JSXAttribute"&&b.name.name===x))return;let z=a.end-(a.selfClosing?2:1),{line:M,column:U}=a.loc.start;r.prependLeft(z,` ${x}="${i}:${M}:${U}"`)}}),{code:r.toString(),map:r.generateMap()}}var yt={},g="virtual:react-inspector",R="\0"+g,W=/\.(mjs|js|jsx|ts|tsx)$/,q=/\/(node_modules|dist|build|coverage|\.next|\.nuxt|\.svelte-kit|\.output|\.astro)\//;function l(t){return t?t.split("?")[0].split("#")[0].replace(/\\/g,"/"):""}var tt=typeof __filename=="string"?__filename:(0,C.fileURLToPath)(yt.url),d=u.default.dirname(tt),$=l(P.default.existsSync(u.default.resolve(d,"../runtime/install.ts"))?u.default.resolve(d,"../runtime/install.ts"):u.default.resolve(d,"./runtime.js"));function nt(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 I(t){return nt(t,"use client")}function et(t){if(!t)return!1;let n=l(t);return q.test(n)||n.includes("\0")?!1:W.test(n)}function rt(t){return/from\s+["']react-dom\/client["']/.test(t)||/require\(\s*["']react-dom\/client["']\s*\)/.test(t)}function st(t){let r=(l(t).split("/").pop()??"").replace(W,"");return["main","index","app","_app","root","client","entry-client","entry.client"].includes(r)}function it(t,n,e){if(!t)return!1;let r=l(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")?I(n):I(n)||rt(n)||st(r)}function T(t){return t.framework==="vite"?`/@fs/${$}`:$}function y(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:y(t.import,n)}:t}function ot(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)?y(s,n):s&&typeof s=="object"?Object.fromEntries(Object.entries(s).map(([i,o])=>[i,y(o,n)])):s}}function N(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,h.default)(`${s}:${i}:${o}`),e.statusCode=204,e.end()}catch{e.statusCode=400,e.end()}})})}var p=null;function at(){return p||(p=new Promise(t=>{let n=v.default.createServer((e,r)=>{if(e.url==="/__open"&&e.method==="POST"){let s="";e.on("data",i=>s+=i),e.on("end",()=>{try{let{file:i,line:o,column:a}=JSON.parse(s);(0,h.default)(`${i}:${o}:${a}`),r.statusCode=204,r.end()}catch{r.statusCode=400,r.end()}})}else r.statusCode=404,r.end()});n.listen(0,"127.0.0.1",()=>{let e=n.address().port;t(e)})}),p)}function ct(t){let n=t.options.devServer;if(!n||typeof n!="object")return;let e=n.setupMiddlewares;n.setupMiddlewares=(r,s)=>(s.app&&N(s.app),typeof e=="function"?e(r,s):r)}var ut=["*.mjs","*.js","*.jsx","*.ts","*.tsx"],ft="interactive-react-inspector/loader";function pt(t,n){return Array.isArray(t)?[...t,n]:t?[t,n]:n}function lt(t){return t!=="*.js"?{not:"foreign"}:{all:[{not:"foreign"},{path:/\.js$/},{not:{path:/\.(?:jsx|ts|tsx)\.js$/}}]}}function mt(t={}){let n={...t};for(let e of ut)n[e]=pt(n[e],{condition:lt(e),loaders:[{loader:ft,options:{runtime:!0}}]});return n}var D=(0,A.createUnplugin)((t,n)=>({name:"react-inspector",enforce:"pre",resolveId(e){if(e===g)return R},load(e){if(e===R)return`
|
|
2
6
|
"use client";
|
|
3
|
-
import ${JSON.stringify(
|
|
4
|
-
`},transform(e,r){if(!
|
|
5
|
-
`+s.code),s},vite:{configureServer(e){W(e.middlewares)}},webpack(e){Z(e,I(n)),tt(e)}}));
|
|
7
|
+
import ${JSON.stringify(T(n))};
|
|
8
|
+
`},transform(e,r){if(!et(r))return;let s=O(e,r);return it(r,e,n.framework)&&s&&(s.code=w(s.code,g)),s},vite:{configureServer(e){N(e.middlewares)}},webpack(e){ot(e,T(n)),ct(e)}}));function L(t={}){let n=t.webpack;return{...t,turbopack:{...t.turbopack,rules:mt(t.turbopack?.rules)},async rewrites(){let e=await at(),r=typeof t.rewrites=="function"?await t.rewrites():t.rewrites,s={source:"/__open",destination:`http://127.0.0.1:${e}/__open`};return Array.isArray(r)?[...r,s]:r&&typeof r=="object"?{...r,fallback:[...r.fallback||[],s]}:[s]},webpack(e,r){let s=typeof n=="function"?n(e,r)??e:e;return s.plugins??=[],s.plugins.push(D.webpack()),s}}}var dt=Object.assign(D,{next:L});0&&(module.exports={next});
|
|
6
9
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +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"]}
|
|
1
|
+
{"version":3,"sources":["../src/unplugin/index.ts","../src/core/imports.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\nimport http from \"node:http\";\r\nimport type { AddressInfo } from \"node:net\";\r\n\r\nimport fs from \"node:fs\";\n\nimport { injectSideEffectImport } from \"../core/imports.ts\";\nimport { transform as sourceTransform } from \"../core/transform.ts\";\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 currentFile = typeof __filename === \"string\"\n ? __filename\n : fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(currentFile);\nconst RUNTIME_PATH = normalizeId(\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\nlet bridgePortPromise: Promise<number> | null = null;\r\n\r\nfunction getBridgeServerPort() {\r\n if (bridgePortPromise) return bridgePortPromise;\r\n\r\n bridgePortPromise = new Promise((resolve) => {\r\n const server = http.createServer((req, res) => {\r\n if (req.url === \"/__open\" && req.method === \"POST\") {\r\n let body = \"\";\r\n req.on(\"data\", (chunk) => (body += chunk));\r\n req.on(\"end\", () => {\r\n try {\r\n const { file, line, column } = JSON.parse(body);\r\n launch(`${file}:${line}:${column}`);\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 } else {\r\n res.statusCode = 404;\r\n res.end();\r\n }\r\n });\r\n\r\n server.listen(0, \"127.0.0.1\", () => {\r\n const port = (server.address() as AddressInfo).port;\r\n resolve(port);\r\n });\r\n });\r\n\r\n return bridgePortPromise;\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\ntype NextConfigLike = Record<string, any> & {\r\n turbopack?: Record<string, any> & {\r\n rules?: Record<string, any>;\r\n };\r\n webpack?: ((config: any, context: any) => any) | null;\r\n rewrites?: (() => Promise<any> | any) | any;\r\n};\n\nconst TURBOPACK_EXTENSIONS = [\"*.mjs\", \"*.js\", \"*.jsx\", \"*.ts\", \"*.tsx\"];\nconst TURBOPACK_LOADER = \"interactive-react-inspector/loader\";\n\nfunction appendTurbopackRule(existing: unknown, rule: unknown) {\n return Array.isArray(existing)\n ? [...existing, rule]\n : existing\n ? [existing, rule]\n : rule;\n}\n\nfunction getTurbopackCondition(extension: string) {\n if (extension !== \"*.js\") return { not: \"foreign\" };\n\n return {\n all: [\n { not: \"foreign\" },\n { path: /\\.js$/ },\n { not: { path: /\\.(?:jsx|ts|tsx)\\.js$/ } },\n ],\n };\n}\n\nfunction createTurbopackRules(existingRules: Record<string, any> = {}) {\n const rules = { ...existingRules };\n\n for (const extension of TURBOPACK_EXTENSIONS) {\n rules[extension] = appendTurbopackRule(rules[extension], {\n condition: getTurbopackCondition(extension),\n loaders: [\n {\n loader: TURBOPACK_LOADER,\n options: { runtime: true },\n },\n ],\n });\n }\n\n return rules;\n}\n\nconst Inspector = createUnplugin((_options, meta) => ({\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 = injectSideEffectImport(result.code, VIRTUAL_ID);\n }\n\n return result;\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}));\n\nfunction next<TConfig extends NextConfigLike>(config: TConfig = {} as TConfig) {\r\n const originalWebpack = config.webpack;\r\n\r\n return {\r\n ...config,\r\n turbopack: {\r\n ...config.turbopack,\r\n rules: createTurbopackRules(config.turbopack?.rules),\r\n },\r\n async rewrites() {\r\n const bridgePort = await getBridgeServerPort();\r\n const originalRewrites = typeof config.rewrites === \"function\"\r\n ? await config.rewrites()\r\n : config.rewrites;\r\n\r\n const inspectorRewrite = {\r\n source: \"/__open\",\r\n destination: `http://127.0.0.1:${bridgePort}/__open`,\r\n };\r\n\r\n if (Array.isArray(originalRewrites)) {\r\n return [...originalRewrites, inspectorRewrite];\r\n } else if (originalRewrites && typeof originalRewrites === \"object\") {\r\n return {\r\n ...originalRewrites,\r\n fallback: [...(originalRewrites.fallback || []), inspectorRewrite],\r\n };\r\n }\r\n\r\n return [inspectorRewrite];\r\n },\r\n webpack(webpackConfig: any, context: any) {\r\n const nextWebpackConfig = typeof originalWebpack === \"function\"\r\n ? originalWebpack(webpackConfig, context) ?? webpackConfig\r\n : webpackConfig;\r\n\r\n nextWebpackConfig.plugins ??= [];\r\n nextWebpackConfig.plugins.push(Inspector.webpack());\r\n\r\n return nextWebpackConfig;\r\n },\r\n };\r\n}\n\nexport { next };\n\nexport default Object.assign(Inspector, { next });\n","function getDirectiveInsertOffset(code: string) {\n let offset = 0;\n let insertOffset = 0;\n\n if (code.startsWith(\"#!\")) {\n const lineEnd = code.indexOf(\"\\n\");\n offset = lineEnd === -1 ? code.length : lineEnd + 1;\n insertOffset = offset;\n }\n\n while (offset < code.length) {\n const lineEnd = code.indexOf(\"\\n\", offset);\n const end = lineEnd === -1 ? code.length : lineEnd + 1;\n const line = code.slice(offset, end);\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith(\"//\")) {\n offset = end;\n continue;\n }\n\n if (trimmed.startsWith(\"/*\")) {\n const blockEnd = code.indexOf(\"*/\", offset + 2);\n offset = blockEnd === -1 ? code.length : blockEnd + 2;\n if (code[offset] === \"\\r\") offset += 1;\n if (code[offset] === \"\\n\") offset += 1;\n continue;\n }\n\n if (/^(['\"])(.*?)\\1;?$/.test(trimmed)) {\n insertOffset = end;\n offset = end;\n continue;\n }\n\n break;\n }\n\n return insertOffset;\n}\n\nexport function injectSideEffectImport(code: string, id: string) {\n const statement = `import ${JSON.stringify(id)};`;\n\n if (code.includes(statement)) return code;\n\n const offset = getDirectiveInsertOffset(code);\n\n return `${code.slice(0, offset)}${statement}\\n${code.slice(offset)}`;\n}\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 isInspectableElement(name: any) {\r\n if (name.type !== \"JSXIdentifier\") return false;\r\n const nameStr = name.name;\r\n return /^[a-z]/.test(nameStr) || nameStr === \"Image\" || nameStr === \"Link\";\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 (!isInspectableElement(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","next","__toCommonJS","import_unplugin","import_node_path","import_node_url","import_launch_editor","import_node_http","import_node_fs","getDirectiveInsertOffset","code","offset","insertOffset","lineEnd","end","trimmed","blockEnd","injectSideEffectImport","id","statement","import_node_path","import_parser","import_traverse","import_magic_string","traverse","_traverse","ATTR","normalizeId","id","shouldTransform","isInspectableElement","name","nameStr","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","currentFile","__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","bridgePortPromise","getBridgeServerPort","resolve","server","http","chunk","port","injectWebpackDevServerOpenRoute","devServer","originalSetupMiddlewares","middlewares","TURBOPACK_EXTENSIONS","TURBOPACK_LOADER","appendTurbopackRule","existing","rule","getTurbopackCondition","extension","createTurbopackRules","existingRules","rules","Inspector","_options","result","transform","injectSideEffectImport","next","config","originalWebpack","bridgePort","originalRewrites","inspectorRewrite","webpackConfig","context","nextWebpackConfig","unplugin_default","Inspector","next"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
import * as unplugin from 'unplugin';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
type NextConfigLike = Record<string, any> & {
|
|
4
|
+
turbopack?: Record<string, any> & {
|
|
5
|
+
rules?: Record<string, any>;
|
|
6
|
+
};
|
|
7
|
+
webpack?: ((config: any, context: any) => any) | null;
|
|
8
|
+
rewrites?: (() => Promise<any> | any) | any;
|
|
9
|
+
};
|
|
10
|
+
declare function next<TConfig extends NextConfigLike>(config?: TConfig): TConfig & {
|
|
11
|
+
turbopack: {
|
|
12
|
+
rules: {
|
|
13
|
+
[x: string]: any;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
rewrites(): Promise<any>;
|
|
17
|
+
webpack(webpackConfig: any, context: any): any;
|
|
18
|
+
};
|
|
4
19
|
|
|
5
|
-
|
|
20
|
+
declare const _default: unplugin.UnpluginInstance<unknown, boolean> & {
|
|
21
|
+
next: typeof next;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { _default as default, next };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
import * as unplugin from 'unplugin';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
type NextConfigLike = Record<string, any> & {
|
|
4
|
+
turbopack?: Record<string, any> & {
|
|
5
|
+
rules?: Record<string, any>;
|
|
6
|
+
};
|
|
7
|
+
webpack?: ((config: any, context: any) => any) | null;
|
|
8
|
+
rewrites?: (() => Promise<any> | any) | any;
|
|
9
|
+
};
|
|
10
|
+
declare function next<TConfig extends NextConfigLike>(config?: TConfig): TConfig & {
|
|
11
|
+
turbopack: {
|
|
12
|
+
rules: {
|
|
13
|
+
[x: string]: any;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
rewrites(): Promise<any>;
|
|
17
|
+
webpack(webpackConfig: any, context: any): any;
|
|
18
|
+
};
|
|
4
19
|
|
|
5
|
-
|
|
20
|
+
declare const _default: unplugin.UnpluginInstance<unknown, boolean> & {
|
|
21
|
+
next: typeof next;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { _default as default, next };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a}from"./chunk-
|
|
1
|
+
import{a,b}from"./chunk-RY62FD45.js";import"./chunk-VI6QGAEY.js";export{b as default,a as next};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/loader.cjs
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";var $=Object.create;var l=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var M=Object.getPrototypeOf,j=Object.prototype.hasOwnProperty;var J=(t,e)=>{for(var n in e)l(t,n,{get:e[n],enumerable:!0})},m=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of I(e))!j.call(t,s)&&s!==n&&l(t,s,{get:()=>e[s],enumerable:!(r=k(e,s))||r.enumerable});return t};var u=(t,e,n)=>(n=t!=null?$(M(t)):{},m(e||!t||!t.__esModule?l(n,"default",{value:t,enumerable:!0}):n,t)),L=t=>m(l({},"__esModule",{value:!0}),t);var C={};J(C,{default:()=>z});module.exports=L(C);function N(t){let e=0,n=0;if(t.startsWith("#!")){let r=t.indexOf(`
|
|
2
|
+
`);e=r===-1?t.length:r+1,n=e}for(;e<t.length;){let r=t.indexOf(`
|
|
3
|
+
`,e),s=r===-1?t.length:r+1,i=t.slice(e,s).trim();if(!i||i.startsWith("//")){e=s;continue}if(i.startsWith("/*")){let o=t.indexOf("*/",e+2);e=o===-1?t.length:o+2,t[e]==="\r"&&(e+=1),t[e]===`
|
|
4
|
+
`&&(e+=1);continue}if(/^(['"])(.*?)\1;?$/.test(i)){n=s,e=s;continue}break}return n}function d(t,e){let n=`import ${JSON.stringify(e)};`;if(t.includes(n))return t;let r=N(t);return`${t.slice(0,r)}${n}
|
|
5
|
+
${t.slice(r)}`}var h=u(require("path"),1),x=require("@babel/parser"),p=u(require("@babel/traverse"),1),b=u(require("magic-string"),1),P=p.default.default||p.default,g="data-source";function E(t){return t.split("?")[0].split("#")[0].replace(/\\/g,"/")}function w(t){return/\.(mjs|js|jsx|ts|tsx)$/.test(E(t))}function A(t){if(t.type!=="JSXIdentifier")return!1;let e=t.name;return/^[a-z]/.test(e)||e==="Image"||e==="Link"}function O(t,e){if(process.env.NODE_ENV==="production")return;let n=E(e);if(!w(n))return null;let r=new b.default(t),s;try{s=(0,x.parse)(t,{sourceType:"unambiguous",plugins:["jsx","typescript","decorators-legacy","classProperties","classPrivateProperties","classPrivateMethods","importAttributes"]})}catch{return null}let a=h.default.relative(process.cwd(),n).replaceAll("\\","/");return P(s,{JSXOpeningElement(i){let o=i.node;if(!o.loc||!A(o.name)||o.attributes.some(f=>f.type==="JSXAttribute"&&f.name.name===g))return;let S=o.end-(o.selfClosing?2:1),{line:v,column:T}=o.loc.start;r.prependLeft(S,` ${g}="${a}:${v}:${T}"`)}}),{code:r.toString(),map:r.generateMap()}}var c=u(require("typescript"),1);function W(t){return t?.endsWith(".js")?`${t}x`:t}function X(t,e){let n=c.default.transpileModule(t,{fileName:W(e),compilerOptions:{jsx:c.default.JsxEmit.ReactJSX,module:c.default.ModuleKind.ESNext,target:c.default.ScriptTarget.ES2022,sourceMap:!0}});return{code:n.outputText,map:n.sourceMapText?JSON.parse(n.sourceMapText):void 0}}function y(t,e){this.cacheable?.();let n=this.getOptions?.()??{},r=t,s=e;if(process.env.NODE_ENV!=="production"){if(n.transform!==!1){let i=O(r,this.resourcePath??"");i&&(r=i.code,s=i.map)}n.runtime&&(r=d(r,"interactive-react-inspector/runtime"))}let a=X(r,this.resourcePath);if(r=a.code,s=a.map??s,this.callback){this.callback(null,r,s);return}return r}typeof module<"u"&&(module.exports=y);var z=y;
|
|
6
|
+
//# sourceMappingURL=loader.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/loader.ts","../src/core/imports.ts","../src/core/transform.ts"],"sourcesContent":["import { injectSideEffectImport } from \"./core/imports.ts\";\nimport { transform as sourceTransform } from \"./core/transform.ts\";\nimport ts from \"typescript\";\n\ntype LoaderOptions = {\n runtime?: boolean;\n transform?: boolean;\n};\n\ntype LoaderContext = {\n resourcePath?: string;\n cacheable?: (flag?: boolean) => void;\n getOptions?: () => LoaderOptions;\n callback?: (error: Error | null, content?: string, sourceMap?: unknown) => void;\n};\n\nfunction getTranspileFileName(fileName?: string) {\n return fileName?.endsWith(\".js\") ? `${fileName}x` : fileName;\n}\n\nfunction transpileForTurbopack(code: string, fileName?: string) {\n const result = ts.transpileModule(code, {\n fileName: getTranspileFileName(fileName),\n compilerOptions: {\n jsx: ts.JsxEmit.ReactJSX,\n module: ts.ModuleKind.ESNext,\n target: ts.ScriptTarget.ES2022,\n sourceMap: true,\n },\n });\n\n return {\n code: result.outputText,\n map: result.sourceMapText ? JSON.parse(result.sourceMapText) : undefined,\n };\n}\n\nfunction reactInspectorLoader(\n this: LoaderContext,\n source: string,\n inputSourceMap?: unknown,\n) {\n this.cacheable?.();\n\n const options = this.getOptions?.() ?? {};\n let code = source;\n let map = inputSourceMap;\n\n if (process.env.NODE_ENV !== \"production\") {\n if (options.transform !== false) {\n const result = sourceTransform(code, this.resourcePath ?? \"\");\n\n if (result) {\n code = result.code;\n map = result.map;\n }\n }\n\n if (options.runtime) {\n code = injectSideEffectImport(code, \"interactive-react-inspector/runtime\");\n }\n }\n\n const transpiled = transpileForTurbopack(code, this.resourcePath);\n code = transpiled.code;\n map = transpiled.map ?? map;\n\n if (this.callback) {\n this.callback(null, code, map);\n return;\n }\n\n return code;\n}\n\nif (typeof module !== \"undefined\") {\n module.exports = reactInspectorLoader;\n}\n\nexport default reactInspectorLoader;\n","function getDirectiveInsertOffset(code: string) {\n let offset = 0;\n let insertOffset = 0;\n\n if (code.startsWith(\"#!\")) {\n const lineEnd = code.indexOf(\"\\n\");\n offset = lineEnd === -1 ? code.length : lineEnd + 1;\n insertOffset = offset;\n }\n\n while (offset < code.length) {\n const lineEnd = code.indexOf(\"\\n\", offset);\n const end = lineEnd === -1 ? code.length : lineEnd + 1;\n const line = code.slice(offset, end);\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith(\"//\")) {\n offset = end;\n continue;\n }\n\n if (trimmed.startsWith(\"/*\")) {\n const blockEnd = code.indexOf(\"*/\", offset + 2);\n offset = blockEnd === -1 ? code.length : blockEnd + 2;\n if (code[offset] === \"\\r\") offset += 1;\n if (code[offset] === \"\\n\") offset += 1;\n continue;\n }\n\n if (/^(['\"])(.*?)\\1;?$/.test(trimmed)) {\n insertOffset = end;\n offset = end;\n continue;\n }\n\n break;\n }\n\n return insertOffset;\n}\n\nexport function injectSideEffectImport(code: string, id: string) {\n const statement = `import ${JSON.stringify(id)};`;\n\n if (code.includes(statement)) return code;\n\n const offset = getDirectiveInsertOffset(code);\n\n return `${code.slice(0, offset)}${statement}\\n${code.slice(offset)}`;\n}\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 isInspectableElement(name: any) {\r\n if (name.type !== \"JSXIdentifier\") return false;\r\n const nameStr = name.name;\r\n return /^[a-z]/.test(nameStr) || nameStr === \"Image\" || nameStr === \"Link\";\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 (!isInspectableElement(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":["loader_exports","__export","loader_default","__toCommonJS","getDirectiveInsertOffset","code","offset","insertOffset","lineEnd","end","trimmed","blockEnd","injectSideEffectImport","id","statement","import_node_path","import_parser","import_traverse","import_magic_string","traverse","_traverse","ATTR","normalizeId","id","shouldTransform","isInspectableElement","name","nameStr","transform","code","normalizedId","s","MagicString","ast","relative","path","p","node","a","insert","line","column","import_typescript","getTranspileFileName","fileName","transpileForTurbopack","code","result","ts","reactInspectorLoader","source","inputSourceMap","options","map","transform","injectSideEffectImport","transpiled","loader_default"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type LoaderOptions = {
|
|
2
|
+
runtime?: boolean;
|
|
3
|
+
transform?: boolean;
|
|
4
|
+
};
|
|
5
|
+
type LoaderContext = {
|
|
6
|
+
resourcePath?: string;
|
|
7
|
+
cacheable?: (flag?: boolean) => void;
|
|
8
|
+
getOptions?: () => LoaderOptions;
|
|
9
|
+
callback?: (error: Error | null, content?: string, sourceMap?: unknown) => void;
|
|
10
|
+
};
|
|
11
|
+
declare function reactInspectorLoader(this: LoaderContext, source: string, inputSourceMap?: unknown): string | undefined;
|
|
12
|
+
|
|
13
|
+
export { reactInspectorLoader as default };
|
package/dist/loader.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type LoaderOptions = {
|
|
2
|
+
runtime?: boolean;
|
|
3
|
+
transform?: boolean;
|
|
4
|
+
};
|
|
5
|
+
type LoaderContext = {
|
|
6
|
+
resourcePath?: string;
|
|
7
|
+
cacheable?: (flag?: boolean) => void;
|
|
8
|
+
getOptions?: () => LoaderOptions;
|
|
9
|
+
callback?: (error: Error | null, content?: string, sourceMap?: unknown) => void;
|
|
10
|
+
};
|
|
11
|
+
declare function reactInspectorLoader(this: LoaderContext, source: string, inputSourceMap?: unknown): string | undefined;
|
|
12
|
+
|
|
13
|
+
export { reactInspectorLoader as default };
|
package/dist/loader.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as c,b as u}from"./chunk-VI6QGAEY.js";import n from"typescript";function l(e){return e?.endsWith(".js")?`${e}x`:e}function d(e,s){let r=n.transpileModule(e,{fileName:l(s),compilerOptions:{jsx:n.JsxEmit.ReactJSX,module:n.ModuleKind.ESNext,target:n.ScriptTarget.ES2022,sourceMap:!0}});return{code:r.outputText,map:r.sourceMapText?JSON.parse(r.sourceMapText):void 0}}function p(e,s){this.cacheable?.();let r=this.getOptions?.()??{},t=e,o=s;if(process.env.NODE_ENV!=="production"){if(r.transform!==!1){let i=u(t,this.resourcePath??"");i&&(t=i.code,o=i.map)}r.runtime&&(t=c(t,"interactive-react-inspector/runtime"))}let a=d(t,this.resourcePath);if(t=a.code,o=a.map??o,this.callback){this.callback(null,t,o);return}return t}typeof module<"u"&&(module.exports=p);var g=p;export{g as default};
|
|
2
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/loader.ts"],"sourcesContent":["import { injectSideEffectImport } from \"./core/imports.ts\";\nimport { transform as sourceTransform } from \"./core/transform.ts\";\nimport ts from \"typescript\";\n\ntype LoaderOptions = {\n runtime?: boolean;\n transform?: boolean;\n};\n\ntype LoaderContext = {\n resourcePath?: string;\n cacheable?: (flag?: boolean) => void;\n getOptions?: () => LoaderOptions;\n callback?: (error: Error | null, content?: string, sourceMap?: unknown) => void;\n};\n\nfunction getTranspileFileName(fileName?: string) {\n return fileName?.endsWith(\".js\") ? `${fileName}x` : fileName;\n}\n\nfunction transpileForTurbopack(code: string, fileName?: string) {\n const result = ts.transpileModule(code, {\n fileName: getTranspileFileName(fileName),\n compilerOptions: {\n jsx: ts.JsxEmit.ReactJSX,\n module: ts.ModuleKind.ESNext,\n target: ts.ScriptTarget.ES2022,\n sourceMap: true,\n },\n });\n\n return {\n code: result.outputText,\n map: result.sourceMapText ? JSON.parse(result.sourceMapText) : undefined,\n };\n}\n\nfunction reactInspectorLoader(\n this: LoaderContext,\n source: string,\n inputSourceMap?: unknown,\n) {\n this.cacheable?.();\n\n const options = this.getOptions?.() ?? {};\n let code = source;\n let map = inputSourceMap;\n\n if (process.env.NODE_ENV !== \"production\") {\n if (options.transform !== false) {\n const result = sourceTransform(code, this.resourcePath ?? \"\");\n\n if (result) {\n code = result.code;\n map = result.map;\n }\n }\n\n if (options.runtime) {\n code = injectSideEffectImport(code, \"interactive-react-inspector/runtime\");\n }\n }\n\n const transpiled = transpileForTurbopack(code, this.resourcePath);\n code = transpiled.code;\n map = transpiled.map ?? map;\n\n if (this.callback) {\n this.callback(null, code, map);\n return;\n }\n\n return code;\n}\n\nif (typeof module !== \"undefined\") {\n module.exports = reactInspectorLoader;\n}\n\nexport default reactInspectorLoader;\n"],"mappings":"+CAEA,OAAOA,MAAQ,aAcf,SAASC,EAAqBC,EAAmB,CAC7C,OAAOA,GAAU,SAAS,KAAK,EAAI,GAAGA,CAAQ,IAAMA,CACxD,CAEA,SAASC,EAAsBC,EAAcF,EAAmB,CAC5D,IAAMG,EAASL,EAAG,gBAAgBI,EAAM,CACpC,SAAUH,EAAqBC,CAAQ,EACvC,gBAAiB,CACb,IAAKF,EAAG,QAAQ,SAChB,OAAQA,EAAG,WAAW,OACtB,OAAQA,EAAG,aAAa,OACxB,UAAW,EACf,CACJ,CAAC,EAED,MAAO,CACH,KAAMK,EAAO,WACb,IAAKA,EAAO,cAAgB,KAAK,MAAMA,EAAO,aAAa,EAAI,MACnE,CACJ,CAEA,SAASC,EAELC,EACAC,EACF,CACE,KAAK,YAAY,EAEjB,IAAMC,EAAU,KAAK,aAAa,GAAK,CAAC,EACpCL,EAAOG,EACPG,EAAMF,EAEV,GAAI,QAAQ,IAAI,WAAa,aAAc,CACvC,GAAIC,EAAQ,YAAc,GAAO,CAC7B,IAAMJ,EAASM,EAAgBP,EAAM,KAAK,cAAgB,EAAE,EAExDC,IACAD,EAAOC,EAAO,KACdK,EAAML,EAAO,IAErB,CAEII,EAAQ,UACRL,EAAOQ,EAAuBR,EAAM,qCAAqC,EAEjF,CAEA,IAAMS,EAAaV,EAAsBC,EAAM,KAAK,YAAY,EAIhE,GAHAA,EAAOS,EAAW,KAClBH,EAAMG,EAAW,KAAOH,EAEpB,KAAK,SAAU,CACf,KAAK,SAAS,KAAMN,EAAMM,CAAG,EAC7B,MACJ,CAEA,OAAON,CACX,CAEI,OAAO,OAAW,MAClB,OAAO,QAAUE,GAGrB,IAAOQ,EAAQR","names":["ts","getTranspileFileName","fileName","transpileForTurbopack","code","result","reactInspectorLoader","source","inputSourceMap","options","map","transform","injectSideEffectImport","transpiled","loader_default"]}
|
package/dist/runtime.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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})},
|
|
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})},E=(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 j=e=>E(d({},"__esModule",{value:!0}),e);var k={};v(k,{installInspector:()=>f});module.exports=j(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){e&&await fetch("/__open",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}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
2
|
:host {
|
|
3
3
|
all: initial;
|
|
4
4
|
}
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
button[data-active="true"]::before {
|
|
41
41
|
background: #fef3c7;
|
|
42
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,
|
|
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,b())}function b(){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)){b();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 f(){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))}f();0&&(module.exports={installInspector});
|
|
44
44
|
//# sourceMappingURL=runtime.cjs.map
|
package/dist/runtime.cjs.map
CHANGED
|
@@ -1 +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"]}
|
|
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 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\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();"],"mappings":"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","names":["install_exports","__export","installInspector","__toCommonJS","ATTR","INSPECTOR_ROOT_ID","REGEX","parseSource","value","match","openSource","source","installed","selectMode","activeTarget","root","toggleButton","highlight","label","createOverlay","shadow","style","setSelectMode","next","hideHighlight","getSourceTarget","node","renderHighlight","target","rect","parsed"]}
|
package/dist/runtime.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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
|
|
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 b(e){e&&await fetch("/__open",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}var u=!1,o=!1,r=null,l=null,a=null,i=null,t=null;function f(){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
2
|
:host {
|
|
3
3
|
all: initial;
|
|
4
4
|
}
|
|
@@ -40,5 +40,5 @@ var I="data-source",y="__react_inspector_overlay__",g=/(.+):(\d+):(\d+)$/;functi
|
|
|
40
40
|
button[data-active="true"]::before {
|
|
41
41
|
background: #fef3c7;
|
|
42
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,
|
|
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,f(),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 b(s)},!0))}h();export{h as installInspector};
|
|
44
44
|
//# sourceMappingURL=runtime.js.map
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +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"]}
|
|
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 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\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();"],"mappings":"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","names":["ATTR","INSPECTOR_ROOT_ID","REGEX","parseSource","value","match","openSource","source","installed","selectMode","activeTarget","root","toggleButton","highlight","label","createOverlay","shadow","style","setSelectMode","next","hideHighlight","getSourceTarget","node","renderHighlight","target","rect","installInspector","parsed"]}
|
package/dist/vite.cjs
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var J=Object.create;var f=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var V=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var K=(t,n)=>{for(var e in n)f(t,e,{get:n[e],enumerable:!0})},k=(t,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of X(n))!H.call(t,s)&&s!==e&&f(t,s,{get:()=>n[s],enumerable:!(r=B(n,s))||r.enumerable});return t};var c=(t,n,e)=>(e=t!=null?J(V(t)):{},k(n||!t||!t.__esModule?f(e,"default",{value:t,enumerable:!0}):e,t)),F=t=>k(f({},"__esModule",{value:!0}),t);var gt={};K(gt,{default:()=>dt,next:()=>L});module.exports=F(gt);var A=require("unplugin"),u=c(require("path"),1),C=require("url"),h=c(require("launch-editor"),1),v=c(require("http"),1),P=c(require("fs"),1);function G(t){let n=0,e=0;if(t.startsWith("#!")){let r=t.indexOf(`
|
|
2
|
+
`);n=r===-1?t.length:r+1,e=n}for(;n<t.length;){let r=t.indexOf(`
|
|
3
|
+
`,n),s=r===-1?t.length:r+1,o=t.slice(n,s).trim();if(!o||o.startsWith("//")){n=s;continue}if(o.startsWith("/*")){let a=t.indexOf("*/",n+2);n=a===-1?t.length:a+2,t[n]==="\r"&&(n+=1),t[n]===`
|
|
4
|
+
`&&(n+=1);continue}if(/^(['"])(.*?)\1;?$/.test(o)){e=s,n=s;continue}break}return e}function w(t,n){let e=`import ${JSON.stringify(n)};`;if(t.includes(e))return t;let r=G(t);return`${t.slice(0,r)}${e}
|
|
5
|
+
${t.slice(r)}`}var j=c(require("path"),1),_=require("@babel/parser"),m=c(require("@babel/traverse"),1),S=c(require("magic-string"),1),Q=m.default.default||m.default,x="data-source";function E(t){return t.split("?")[0].split("#")[0].replace(/\\/g,"/")}function Y(t){return/\.(mjs|js|jsx|ts|tsx)$/.test(E(t))}function Z(t){if(t.type!=="JSXIdentifier")return!1;let n=t.name;return/^[a-z]/.test(n)||n==="Image"||n==="Link"}function O(t,n){if(process.env.NODE_ENV==="production")return;let e=E(n);if(!Y(e))return null;let r=new S.default(t),s;try{s=(0,_.parse)(t,{sourceType:"unambiguous",plugins:["jsx","typescript","decorators-legacy","classProperties","classPrivateProperties","classPrivateMethods","importAttributes"]})}catch{return null}let i=j.default.relative(process.cwd(),e).replaceAll("\\","/");return Q(s,{JSXOpeningElement(o){let a=o.node;if(!a.loc||!Z(a.name)||a.attributes.some(b=>b.type==="JSXAttribute"&&b.name.name===x))return;let z=a.end-(a.selfClosing?2:1),{line:M,column:U}=a.loc.start;r.prependLeft(z,` ${x}="${i}:${M}:${U}"`)}}),{code:r.toString(),map:r.generateMap()}}var yt={},g="virtual:react-inspector",R="\0"+g,W=/\.(mjs|js|jsx|ts|tsx)$/,q=/\/(node_modules|dist|build|coverage|\.next|\.nuxt|\.svelte-kit|\.output|\.astro)\//;function l(t){return t?t.split("?")[0].split("#")[0].replace(/\\/g,"/"):""}var tt=typeof __filename=="string"?__filename:(0,C.fileURLToPath)(yt.url),d=u.default.dirname(tt),$=l(P.default.existsSync(u.default.resolve(d,"../runtime/install.ts"))?u.default.resolve(d,"../runtime/install.ts"):u.default.resolve(d,"./runtime.js"));function nt(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 I(t){return nt(t,"use client")}function et(t){if(!t)return!1;let n=l(t);return q.test(n)||n.includes("\0")?!1:W.test(n)}function rt(t){return/from\s+["']react-dom\/client["']/.test(t)||/require\(\s*["']react-dom\/client["']\s*\)/.test(t)}function st(t){let r=(l(t).split("/").pop()??"").replace(W,"");return["main","index","app","_app","root","client","entry-client","entry.client"].includes(r)}function it(t,n,e){if(!t)return!1;let r=l(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")?I(n):I(n)||rt(n)||st(r)}function T(t){return t.framework==="vite"?`/@fs/${$}`:$}function y(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:y(t.import,n)}:t}function ot(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)?y(s,n):s&&typeof s=="object"?Object.fromEntries(Object.entries(s).map(([i,o])=>[i,y(o,n)])):s}}function N(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,h.default)(`${s}:${i}:${o}`),e.statusCode=204,e.end()}catch{e.statusCode=400,e.end()}})})}var p=null;function at(){return p||(p=new Promise(t=>{let n=v.default.createServer((e,r)=>{if(e.url==="/__open"&&e.method==="POST"){let s="";e.on("data",i=>s+=i),e.on("end",()=>{try{let{file:i,line:o,column:a}=JSON.parse(s);(0,h.default)(`${i}:${o}:${a}`),r.statusCode=204,r.end()}catch{r.statusCode=400,r.end()}})}else r.statusCode=404,r.end()});n.listen(0,"127.0.0.1",()=>{let e=n.address().port;t(e)})}),p)}function ct(t){let n=t.options.devServer;if(!n||typeof n!="object")return;let e=n.setupMiddlewares;n.setupMiddlewares=(r,s)=>(s.app&&N(s.app),typeof e=="function"?e(r,s):r)}var ut=["*.mjs","*.js","*.jsx","*.ts","*.tsx"],ft="interactive-react-inspector/loader";function pt(t,n){return Array.isArray(t)?[...t,n]:t?[t,n]:n}function lt(t){return t!=="*.js"?{not:"foreign"}:{all:[{not:"foreign"},{path:/\.js$/},{not:{path:/\.(?:jsx|ts|tsx)\.js$/}}]}}function mt(t={}){let n={...t};for(let e of ut)n[e]=pt(n[e],{condition:lt(e),loaders:[{loader:ft,options:{runtime:!0}}]});return n}var D=(0,A.createUnplugin)((t,n)=>({name:"react-inspector",enforce:"pre",resolveId(e){if(e===g)return R},load(e){if(e===R)return`
|
|
2
6
|
"use client";
|
|
3
|
-
import ${JSON.stringify(
|
|
4
|
-
`},transform(e,r){if(!
|
|
5
|
-
`+s.code),s},vite:{configureServer(e){W(e.middlewares)}},webpack(e){Z(e,I(n)),tt(e)}}));
|
|
7
|
+
import ${JSON.stringify(T(n))};
|
|
8
|
+
`},transform(e,r){if(!et(r))return;let s=O(e,r);return it(r,e,n.framework)&&s&&(s.code=w(s.code,g)),s},vite:{configureServer(e){N(e.middlewares)}},webpack(e){ot(e,T(n)),ct(e)}}));function L(t={}){let n=t.webpack;return{...t,turbopack:{...t.turbopack,rules:mt(t.turbopack?.rules)},async rewrites(){let e=await at(),r=typeof t.rewrites=="function"?await t.rewrites():t.rewrites,s={source:"/__open",destination:`http://127.0.0.1:${e}/__open`};return Array.isArray(r)?[...r,s]:r&&typeof r=="object"?{...r,fallback:[...r.fallback||[],s]}:[s]},webpack(e,r){let s=typeof n=="function"?n(e,r)??e:e;return s.plugins??=[],s.plugins.push(D.webpack()),s}}}var dt=Object.assign(D,{next:L});0&&(module.exports={next});
|
|
6
9
|
//# sourceMappingURL=vite.cjs.map
|
package/dist/vite.cjs.map
CHANGED
|
@@ -1 +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"]}
|
|
1
|
+
{"version":3,"sources":["../src/unplugin/index.ts","../src/core/imports.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\nimport http from \"node:http\";\r\nimport type { AddressInfo } from \"node:net\";\r\n\r\nimport fs from \"node:fs\";\n\nimport { injectSideEffectImport } from \"../core/imports.ts\";\nimport { transform as sourceTransform } from \"../core/transform.ts\";\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 currentFile = typeof __filename === \"string\"\n ? __filename\n : fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(currentFile);\nconst RUNTIME_PATH = normalizeId(\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\nlet bridgePortPromise: Promise<number> | null = null;\r\n\r\nfunction getBridgeServerPort() {\r\n if (bridgePortPromise) return bridgePortPromise;\r\n\r\n bridgePortPromise = new Promise((resolve) => {\r\n const server = http.createServer((req, res) => {\r\n if (req.url === \"/__open\" && req.method === \"POST\") {\r\n let body = \"\";\r\n req.on(\"data\", (chunk) => (body += chunk));\r\n req.on(\"end\", () => {\r\n try {\r\n const { file, line, column } = JSON.parse(body);\r\n launch(`${file}:${line}:${column}`);\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 } else {\r\n res.statusCode = 404;\r\n res.end();\r\n }\r\n });\r\n\r\n server.listen(0, \"127.0.0.1\", () => {\r\n const port = (server.address() as AddressInfo).port;\r\n resolve(port);\r\n });\r\n });\r\n\r\n return bridgePortPromise;\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\ntype NextConfigLike = Record<string, any> & {\r\n turbopack?: Record<string, any> & {\r\n rules?: Record<string, any>;\r\n };\r\n webpack?: ((config: any, context: any) => any) | null;\r\n rewrites?: (() => Promise<any> | any) | any;\r\n};\n\nconst TURBOPACK_EXTENSIONS = [\"*.mjs\", \"*.js\", \"*.jsx\", \"*.ts\", \"*.tsx\"];\nconst TURBOPACK_LOADER = \"interactive-react-inspector/loader\";\n\nfunction appendTurbopackRule(existing: unknown, rule: unknown) {\n return Array.isArray(existing)\n ? [...existing, rule]\n : existing\n ? [existing, rule]\n : rule;\n}\n\nfunction getTurbopackCondition(extension: string) {\n if (extension !== \"*.js\") return { not: \"foreign\" };\n\n return {\n all: [\n { not: \"foreign\" },\n { path: /\\.js$/ },\n { not: { path: /\\.(?:jsx|ts|tsx)\\.js$/ } },\n ],\n };\n}\n\nfunction createTurbopackRules(existingRules: Record<string, any> = {}) {\n const rules = { ...existingRules };\n\n for (const extension of TURBOPACK_EXTENSIONS) {\n rules[extension] = appendTurbopackRule(rules[extension], {\n condition: getTurbopackCondition(extension),\n loaders: [\n {\n loader: TURBOPACK_LOADER,\n options: { runtime: true },\n },\n ],\n });\n }\n\n return rules;\n}\n\nconst Inspector = createUnplugin((_options, meta) => ({\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 = injectSideEffectImport(result.code, VIRTUAL_ID);\n }\n\n return result;\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}));\n\nfunction next<TConfig extends NextConfigLike>(config: TConfig = {} as TConfig) {\r\n const originalWebpack = config.webpack;\r\n\r\n return {\r\n ...config,\r\n turbopack: {\r\n ...config.turbopack,\r\n rules: createTurbopackRules(config.turbopack?.rules),\r\n },\r\n async rewrites() {\r\n const bridgePort = await getBridgeServerPort();\r\n const originalRewrites = typeof config.rewrites === \"function\"\r\n ? await config.rewrites()\r\n : config.rewrites;\r\n\r\n const inspectorRewrite = {\r\n source: \"/__open\",\r\n destination: `http://127.0.0.1:${bridgePort}/__open`,\r\n };\r\n\r\n if (Array.isArray(originalRewrites)) {\r\n return [...originalRewrites, inspectorRewrite];\r\n } else if (originalRewrites && typeof originalRewrites === \"object\") {\r\n return {\r\n ...originalRewrites,\r\n fallback: [...(originalRewrites.fallback || []), inspectorRewrite],\r\n };\r\n }\r\n\r\n return [inspectorRewrite];\r\n },\r\n webpack(webpackConfig: any, context: any) {\r\n const nextWebpackConfig = typeof originalWebpack === \"function\"\r\n ? originalWebpack(webpackConfig, context) ?? webpackConfig\r\n : webpackConfig;\r\n\r\n nextWebpackConfig.plugins ??= [];\r\n nextWebpackConfig.plugins.push(Inspector.webpack());\r\n\r\n return nextWebpackConfig;\r\n },\r\n };\r\n}\n\nexport { next };\n\nexport default Object.assign(Inspector, { next });\n","function getDirectiveInsertOffset(code: string) {\n let offset = 0;\n let insertOffset = 0;\n\n if (code.startsWith(\"#!\")) {\n const lineEnd = code.indexOf(\"\\n\");\n offset = lineEnd === -1 ? code.length : lineEnd + 1;\n insertOffset = offset;\n }\n\n while (offset < code.length) {\n const lineEnd = code.indexOf(\"\\n\", offset);\n const end = lineEnd === -1 ? code.length : lineEnd + 1;\n const line = code.slice(offset, end);\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith(\"//\")) {\n offset = end;\n continue;\n }\n\n if (trimmed.startsWith(\"/*\")) {\n const blockEnd = code.indexOf(\"*/\", offset + 2);\n offset = blockEnd === -1 ? code.length : blockEnd + 2;\n if (code[offset] === \"\\r\") offset += 1;\n if (code[offset] === \"\\n\") offset += 1;\n continue;\n }\n\n if (/^(['\"])(.*?)\\1;?$/.test(trimmed)) {\n insertOffset = end;\n offset = end;\n continue;\n }\n\n break;\n }\n\n return insertOffset;\n}\n\nexport function injectSideEffectImport(code: string, id: string) {\n const statement = `import ${JSON.stringify(id)};`;\n\n if (code.includes(statement)) return code;\n\n const offset = getDirectiveInsertOffset(code);\n\n return `${code.slice(0, offset)}${statement}\\n${code.slice(offset)}`;\n}\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 isInspectableElement(name: any) {\r\n if (name.type !== \"JSXIdentifier\") return false;\r\n const nameStr = name.name;\r\n return /^[a-z]/.test(nameStr) || nameStr === \"Image\" || nameStr === \"Link\";\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 (!isInspectableElement(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","next","__toCommonJS","import_unplugin","import_node_path","import_node_url","import_launch_editor","import_node_http","import_node_fs","getDirectiveInsertOffset","code","offset","insertOffset","lineEnd","end","trimmed","blockEnd","injectSideEffectImport","id","statement","import_node_path","import_parser","import_traverse","import_magic_string","traverse","_traverse","ATTR","normalizeId","id","shouldTransform","isInspectableElement","name","nameStr","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","currentFile","__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","bridgePortPromise","getBridgeServerPort","resolve","server","http","chunk","port","injectWebpackDevServerOpenRoute","devServer","originalSetupMiddlewares","middlewares","TURBOPACK_EXTENSIONS","TURBOPACK_LOADER","appendTurbopackRule","existing","rule","getTurbopackCondition","extension","createTurbopackRules","existingRules","rules","Inspector","_options","result","transform","injectSideEffectImport","next","config","originalWebpack","bridgePort","originalRewrites","inspectorRewrite","webpackConfig","context","nextWebpackConfig","unplugin_default","Inspector","next"]}
|
package/dist/vite.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import 'unplugin';
|
|
2
|
-
export { default } from './index.cjs';
|
|
2
|
+
export { default, next } from './index.cjs';
|
package/dist/vite.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import 'unplugin';
|
|
2
|
-
export { default } from './index.js';
|
|
2
|
+
export { default, next } from './index.js';
|
package/dist/vite.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a}from"./chunk-
|
|
1
|
+
import{a,b}from"./chunk-RY62FD45.js";import"./chunk-VI6QGAEY.js";export{b as default,a as next};
|
|
2
2
|
//# sourceMappingURL=vite.js.map
|
package/package.json
CHANGED
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "interactive-react-inspector",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "React component inspector and source code jump utility",
|
|
5
5
|
"author": "Jakub Sokol",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"exports": {
|
|
9
|
-
".":
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs"
|
|
13
|
+
},
|
|
14
|
+
"./vite": {
|
|
15
|
+
"types": "./dist/vite.d.ts",
|
|
16
|
+
"import": "./dist/vite.js",
|
|
17
|
+
"require": "./dist/vite.cjs"
|
|
18
|
+
},
|
|
19
|
+
"./runtime": {
|
|
20
|
+
"types": "./dist/runtime.d.ts",
|
|
21
|
+
"import": "./dist/runtime.js",
|
|
22
|
+
"require": "./dist/runtime.cjs"
|
|
23
|
+
},
|
|
24
|
+
"./loader": {
|
|
25
|
+
"types": "./dist/loader.d.ts",
|
|
26
|
+
"import": "./dist/loader.js",
|
|
27
|
+
"require": "./dist/loader.cjs"
|
|
28
|
+
}
|
|
12
29
|
},
|
|
13
30
|
"main": "dist/index.js",
|
|
14
31
|
"module": "dist/index.js",
|
|
@@ -29,17 +46,20 @@
|
|
|
29
46
|
"@babel/traverse": "^7.29.0",
|
|
30
47
|
"launch-editor": "^2.13.2",
|
|
31
48
|
"magic-string": "^0.30.21",
|
|
49
|
+
"typescript": "^5.7.3",
|
|
32
50
|
"unplugin": "^3.0.0"
|
|
33
51
|
},
|
|
34
52
|
"devDependencies": {
|
|
53
|
+
"@playwright/test": "^1.60.0",
|
|
35
54
|
"@types/babel__traverse": "^7.28.0",
|
|
36
55
|
"@types/node": "^20.19.41",
|
|
37
|
-
"tsup": "^8.3.5"
|
|
38
|
-
"typescript": "^5.7.3"
|
|
56
|
+
"tsup": "^8.3.5"
|
|
39
57
|
},
|
|
40
58
|
"scripts": {
|
|
41
59
|
"build": "tsup",
|
|
42
60
|
"dev": "tsup --watch",
|
|
43
|
-
"
|
|
61
|
+
"pretest:e2e": "pnpm build",
|
|
62
|
+
"test": "pnpm test:e2e",
|
|
63
|
+
"test:e2e": "playwright test"
|
|
44
64
|
}
|
|
45
65
|
}
|
package/dist/chunk-EJKHJJ5M.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|