semantic-inspector 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +120 -49
- package/dist/babel.cjs +7 -59
- package/dist/babel.cjs.map +1 -1
- package/dist/babel.d.cts +10 -10
- package/dist/babel.d.ts +10 -10
- package/dist/babel.js +1 -1
- package/dist/{chunk-AAPCI2HO.js → chunk-AQYKTX6L.js} +13 -9
- package/dist/chunk-AQYKTX6L.js.map +1 -0
- package/dist/chunk-X6NMJJ2M.cjs +68 -0
- package/dist/chunk-X6NMJJ2M.cjs.map +1 -0
- package/dist/index.cjs +95 -53
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +37 -41
- package/dist/index.d.ts +37 -41
- package/dist/index.js +98 -53
- package/dist/index.js.map +1 -1
- package/dist/vite.cjs +5 -64
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.cts +7 -7
- package/dist/vite.d.ts +7 -7
- package/dist/vite.js +4 -2
- package/dist/vite.js.map +1 -1
- package/package.json +24 -8
- package/dist/chunk-AAPCI2HO.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "semantic-inspector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Dev-only React inspector: a hotkey highlights elements and click-copies their `Component — file:line` (or a PNG screenshot) for fast context handoff to AI coding assistants.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,7 +31,6 @@
|
|
|
31
31
|
],
|
|
32
32
|
"sideEffects": false,
|
|
33
33
|
"main": "./dist/index.cjs",
|
|
34
|
-
"module": "./dist/index.js",
|
|
35
34
|
"types": "./dist/index.d.ts",
|
|
36
35
|
"exports": {
|
|
37
36
|
".": {
|
|
@@ -71,33 +70,50 @@
|
|
|
71
70
|
"scripts": {
|
|
72
71
|
"build": "tsup",
|
|
73
72
|
"dev": "tsup --watch",
|
|
73
|
+
"lint": "biome check .",
|
|
74
|
+
"lint:fix": "biome check --write .",
|
|
75
|
+
"typecheck": "tsc --noEmit",
|
|
74
76
|
"test": "vitest run",
|
|
75
77
|
"test:watch": "vitest",
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
+
"test:cov": "vitest run --coverage",
|
|
79
|
+
"test:dist": "node scripts/smoke.mjs",
|
|
80
|
+
"lint:pkg": "publint --strict && attw --pack . --profile node16",
|
|
81
|
+
"changeset": "changeset",
|
|
82
|
+
"version": "changeset version",
|
|
83
|
+
"release": "changeset publish",
|
|
84
|
+
"prepublishOnly": "npm run build && npm run lint:pkg"
|
|
78
85
|
},
|
|
79
86
|
"peerDependencies": {
|
|
87
|
+
"@babel/core": ">=7.25",
|
|
80
88
|
"react": ">=18",
|
|
81
89
|
"react-dom": ">=18",
|
|
82
|
-
"vite": ">=
|
|
90
|
+
"vite": ">=5"
|
|
83
91
|
},
|
|
84
92
|
"peerDependenciesMeta": {
|
|
93
|
+
"@babel/core": {
|
|
94
|
+
"optional": true
|
|
95
|
+
},
|
|
85
96
|
"vite": {
|
|
86
97
|
"optional": true
|
|
87
98
|
}
|
|
88
99
|
},
|
|
89
100
|
"dependencies": {
|
|
90
|
-
"@babel/core": "^7.25.0",
|
|
91
101
|
"modern-screenshot": "^4.7.0"
|
|
92
102
|
},
|
|
93
103
|
"devDependencies": {
|
|
104
|
+
"@arethetypeswrong/cli": "^0.18.1",
|
|
105
|
+
"@babel/core": "^7.25.0",
|
|
106
|
+
"@biomejs/biome": "^2.0.0",
|
|
107
|
+
"@changesets/cli": "^2.27.0",
|
|
94
108
|
"@testing-library/react": "^16.3.2",
|
|
95
109
|
"@types/babel__core": "^7.20.5",
|
|
96
|
-
"@types/node": "^
|
|
110
|
+
"@types/node": "^20.19.0",
|
|
97
111
|
"@types/react": "^19.2.0",
|
|
98
112
|
"@types/react-dom": "^19.2.0",
|
|
99
113
|
"@vitejs/plugin-react": "^6.0.0",
|
|
114
|
+
"@vitest/coverage-v8": "^4.1.4",
|
|
100
115
|
"happy-dom": "^20.9.0",
|
|
116
|
+
"publint": "^0.3.0",
|
|
101
117
|
"react": "^19.2.0",
|
|
102
118
|
"react-dom": "^19.2.0",
|
|
103
119
|
"tsup": "^8.3.0",
|
|
@@ -109,6 +125,6 @@
|
|
|
109
125
|
"access": "public"
|
|
110
126
|
},
|
|
111
127
|
"engines": {
|
|
112
|
-
"node": ">=
|
|
128
|
+
"node": ">=20"
|
|
113
129
|
}
|
|
114
130
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stampLocBabel.ts"],"names":[],"mappings":"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","file":"chunk-AAPCI2HO.js","sourcesContent":["import type { NodePath, PluginObj, types as BabelTypes } from '@babel/core';\n\nexport interface StampLocOptions {\n /** Имя атрибута пути. Default 'data-loc'. */\n attrLoc?: string;\n /** Имя атрибута компонента. Default 'data-comp'. */\n attrComp?: string;\n /** База для относительного пути в data-loc. Default process.cwd(). */\n rootDir?: string;\n}\n\nfunction isHostElement(name: BabelTypes.JSXOpeningElement['name']): boolean {\n return name.type === 'JSXIdentifier' && /^[a-z]/.test(name.name);\n}\n\nfunction hasAttr(el: BabelTypes.JSXOpeningElement, attrName: string): boolean {\n return el.attributes.some(\n (a) => a.type === 'JSXAttribute' && a.name.type === 'JSXIdentifier' && a.name.name === attrName\n );\n}\n\n// Ближайшая функция-компонент с PascalCase-именем вверх по дереву:\n// function Foo() {} | const Foo = () => {} | const Foo = function () {}\nfunction nearestComponentName(path: NodePath): string | null {\n let p: NodePath | null = path;\n while (p) {\n const node = p.node;\n if (node.type === 'FunctionDeclaration' && node.id && /^[A-Z]/.test(node.id.name)) {\n return node.id.name;\n }\n if (node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression') {\n const parent = p.parentPath?.node;\n if (parent?.type === 'VariableDeclarator' && parent.id.type === 'Identifier' && /^[A-Z]/.test(parent.id.name)) {\n return parent.id.name;\n }\n }\n p = p.parentPath;\n }\n return null;\n}\n\n/**\n * Babel-плагин: вешает data-loc=\"<path>:<line>\" и data-comp=\"<Component>\" на\n * JSX host-элементы (div, section, ...). Рантайм-инспектор читает эти DOM-атрибуты\n * (не React-internals), поэтому устойчив к версии React. Компонентные теги\n * (PascalCase) пропускаем — они не дают собственного DOM-узла.\n */\nexport default function stampLocBabel(babel: { types: typeof BabelTypes }, opts: StampLocOptions = {}): PluginObj {\n const t = babel.types;\n const attrLoc = opts.attrLoc ?? 'data-loc';\n const attrComp = opts.attrComp ?? 'data-comp';\n const rootDir = opts.rootDir ?? process.cwd();\n\n const attr = (name: string, value: string) => t.jsxAttribute(t.jsxIdentifier(name), t.stringLiteral(value));\n\n // path.relative без node:path, чтобы плагин не тянул узловые модули в чужих средах.\n const toRel = (file: string): string => {\n let root = rootDir;\n while (root.endsWith('/')) root = root.slice(0, -1);\n const rel = file.startsWith(root + '/') ? file.slice(root.length + 1) : file;\n return rel.split('\\\\').join('/');\n };\n\n return {\n name: 'stamp-loc',\n visitor: {\n JSXOpeningElement(path, state) {\n const node = path.node;\n if (!isHostElement(node.name)) return;\n\n const filename = state.file.opts.filename;\n const loc = node.loc;\n if (!filename || !loc) return;\n\n if (!hasAttr(node, attrLoc)) {\n node.attributes.push(attr(attrLoc, `${toRel(filename)}:${loc.start.line}`));\n }\n if (!hasAttr(node, attrComp)) {\n const comp = nearestComponentName(path);\n if (comp) node.attributes.push(attr(attrComp, comp));\n }\n }\n }\n };\n}\n"]}
|