UNPKG

@dhiwise/component-tagger

Version:

Automatically annotate JSX components and HTML elements with data attributes

2 lines (1 loc) 8.06 kB
"use strict";var U=Object.create;var y=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var Q=(e,t)=>{for(var r in t)y(e,r,{get:t[r],enumerable:!0})},J=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of W(t))!z.call(e,o)&&o!==r&&y(e,o,{get:()=>t[o],enumerable:!(n=V(t,o))||n.enumerable});return e};var x=(e,t,r)=>(r=e!=null?U(K(e)):{},J(t||!e||!e.__esModule?y(r,"default",{value:e,enumerable:!0}):r,e)),Y=e=>J(y({},"__esModule",{value:!0}),e);var ie={};Q(ie,{default:()=>oe});module.exports=Y(ie);var S=x(require("path")),D=require("@babel/parser"),F=require("@babel/core"),H=x(require("magic-string"));var p=x(require("chalk")),$=x(require("picomatch"));var B=new Set(["Fragment","Suspense","StrictMode","Profiler","React.Fragment"]),A=["three","@react-three/fiber","@react-three/drei","@react-three/rapier","@react-three/a11y","@react-three/csg","@react-three/flex","@react-three/gpu-pathtracer","@react-three/postprocessing","@react-three/cannon","@react-three/xr","@react-three/test-renderer","three/addons","three/examples"],_=["object3D","audioListener","positionalAudio","mesh","batchedMesh","instancedMesh","scene","sprite","lOD","skinnedMesh","skeleton","bone","lineSegments","lineLoop","points","group","camera","perspectiveCamera","orthographicCamera","cubeCamera","arrayCamera","instancedBufferGeometry","bufferGeometry","boxBufferGeometry","circleBufferGeometry","coneBufferGeometry","cylinderBufferGeometry","dodecahedronBufferGeometry","extrudeBufferGeometry","icosahedronBufferGeometry","latheBufferGeometry","octahedronBufferGeometry","planeBufferGeometry","polyhedronBufferGeometry","ringBufferGeometry","shapeBufferGeometry","sphereBufferGeometry","tetrahedronBufferGeometry","torusBufferGeometry","torusKnotBufferGeometry","tubeBufferGeometry","wireframeGeometry","tetrahedronGeometry","octahedronGeometry","icosahedronGeometry","dodecahedronGeometry","polyhedronGeometry","tubeGeometry","torusKnotGeometry","torusGeometry","sphereGeometry","ringGeometry","planeGeometry","latheGeometry","shapeGeometry","extrudeGeometry","edgesGeometry","coneGeometry","cylinderGeometry","circleGeometry","boxGeometry","capsuleGeometry","material","shadowMaterial","spriteMaterial","rawShaderMaterial","shaderMaterial","pointsMaterial","meshPhysicalMaterial","meshStandardMaterial","meshPhongMaterial","meshToonMaterial","meshNormalMaterial","meshLambertMaterial","meshDepthMaterial","meshDistanceMaterial","meshBasicMaterial","meshMatcapMaterial","lineDashedMaterial","lineBasicMaterial","primitive","light","spotLightShadow","spotLight","pointLight","rectAreaLight","hemisphereLight","directionalLightShadow","directionalLight","ambientLight","lightShadow","ambientLightProbe","hemisphereLightProbe","lightProbe","spotLightHelper","skeletonHelper","pointLightHelper","hemisphereLightHelper","gridHelper","polarGridHelper","directionalLightHelper","cameraHelper","boxHelper","box3Helper","planeHelper","arrowHelper","axesHelper","texture","videoTexture","dataTexture","dataTexture3D","compressedTexture","cubeTexture","canvasTexture","depthTexture","raycaster","vector2","vector3","vector4","euler","matrix3","matrix4","quaternion","bufferAttribute","float16BufferAttribute","float32BufferAttribute","float64BufferAttribute","int8BufferAttribute","int16BufferAttribute","int32BufferAttribute","uint8BufferAttribute","uint16BufferAttribute","uint32BufferAttribute","instancedBufferAttribute","color","fog","fogExp2","shape","colorShiftMaterial"];function I(e){let t=new Set;for(let r of e.program.body)if(r.type==="ImportDeclaration"){let n=r,o=n.source.value;if(A.some(i=>o===i||o.startsWith(i+"/")))for(let i of n.specifiers)i.type==="ImportSpecifier"||i.type==="ImportDefaultSpecifier"?t.add(i.local.name):i.type==="ImportNamespaceSpecifier"&&t.add(`${i.local.name}.*`)}return t}var G=new Map;function Z(e){let t=e.sort().join(",");if(!G.has(t)){let r=e.map(o=>`**/*${o}`),n=(0,$.default)(r);G.set(t,n)}return G.get(t)}function O(e,t){let r=t.extensions||[".jsx",".tsx",".js",".ts"];return Z(r)(e)?![".test.",".spec.","__tests__","__mocks__"].some(i=>e.includes(i)):!1}function X(e,t,r){return t.includeElements&&t.includeElements.length>0?t.includeElements.includes(e):t.shouldTag?t.shouldTag(e):!(t.excludeElements&&t.excludeElements.includes(e)||B.has(e)||r&&ee(e,r))}function ee(e,t){if(t.has(e)||_.includes(e))return!0;for(let r of t)if(r.endsWith(".*")){let n=r.slice(0,-2);if(e.startsWith(`${n}.`))return!0}return!1}function te(e){if(e){if(e.type==="StringLiteral")return e.value;if(e.type==="JSXExpressionContainer"){let t=e.expression;if(t.type==="StringLiteral")return t.value;if(t.type==="TemplateLiteral"&&t.quasis.length===1)return t.quasis[0].value.raw;if(t.type==="BinaryExpression"&&t.operator==="+"){let r=t.left.type==="StringLiteral"?t.left.value:"",n=t.right.type==="StringLiteral"?t.right.value:"";return r+n}if(t.type==="Identifier")return`[var:${t.name}]`}}}function v(e,t,r){let n={},o=["className","id","src","alt","href","type","name","value"],c=new Set([...o,...t.extractAttributes||[]]);for(let a of e.attributes)if(a.type==="JSXAttribute"&&a.name.type==="JSXIdentifier"){let m=a.name.name;if(!c.has(m))continue;if(a.value){let l=te(a.value);l!==void 0&&(n[m]=l)}else n[m]="true"}else a.type==="JSXSpreadAttribute"&&(n["[spread]"]="true");let i="";return r&&r.children&&(i=r.children.map(a=>a.type==="JSXText"?a.value.trim():a.type==="JSXExpressionContainer"&&a.expression.type==="StringLiteral"?a.expression.value:"").filter(Boolean).join(" ").trim()),i&&(n.textContent=i),n}function R(e){let t=e.name;return t.type==="JSXIdentifier"?t.name:t.type==="JSXMemberExpression"?re(t):"Unknown"}function re(e){return`${e.object.name}.${e.property.name}`}function d(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function w(e,t,r){return`${e}:${t}:${r}`}function b(e,t){if(!t.verbose)return;let r=e;e.includes("Error")||e.includes("error")?r=p.default.red(e):e.includes("Tagged")||e.includes("Summary")?r=p.default.green(e):e.includes("Processing")||e.includes("started")?r=p.default.blue(e):r=p.default.yellow(e),console.log(`[component-tagger] ${r}`)}async function N(e,t,r){if(!O(t,r)||t.includes("node_modules")&&!r.processNodeModules||r.excludeDirectories&&r.excludeDirectories.some(i=>t.includes(i)))return null;let n=process.cwd(),o=S.relative(n,t),c=S.basename(t);b(`Processing file: ${o}`,r);try{let a=(0,D.parse)(e,{sourceType:"module",plugins:["jsx","typescript"]}),m=I(a),l=new H.default(e),E=0,g=null;return(0,F.traverse)(a,{JSXElement:T=>{g=T.node},JSXOpeningElement:T=>{if(!g)return;let f=T.node,C=R(f);if(!X(C,r,m))return;let k=v(f,r,g),L={elementName:C};Object.entries(k).forEach(([M,u])=>{L[M]=u});let h=f.loc?.start?.line??0,P=f.loc?.start?.column??0,j=g?.loc?.end?.line??h,q=r.generateComponentId?r.generateComponentId(o,h,P):w(o,h,P),s=` ${r.attributePrefix}-id="${d(q)}"`;if(r.includeLegacyAttributes&&(s+=` ${r.attributePrefix}-path="${d(o)}"`,s+=` ${r.attributePrefix}-line="${h}"`,s+=` ${r.attributePrefix}-end-line="${j}"`,s+=` ${r.attributePrefix}-file="${d(c)}"`,s+=` ${r.attributePrefix}-name="${d(C)}"`),r.includeContentAttribute){let M=JSON.stringify(L),u=encodeURIComponent(M);r.maxContentLength&&u.length>r.maxContentLength&&(u=u.substring(0,r.maxContentLength)+"..."),s+=` ${r.attributePrefix}-content="${u}"`}l.appendLeft(f.name.end??0,s),b(s.toString(),r),E++}}),E>0?(b(`Tagged ${E} components in ${o}`,r),{code:l.toString(),map:r.sourceMaps?l.generateMap({hires:!0}):null}):null}catch(i){return console.error(`Error processing file ${o}:`,i),null}}async function ne(e){let t=this.resourcePath,r={extensions:[".jsx",".tsx",".js",".ts"],verbose:!1,attributePrefix:"data-component",includeContentAttribute:!0,maxContentLength:1e3,includeLegacyAttributes:!0,sourceMaps:!0,excludeDirectories:[],processNodeModules:!1,...this.query};try{let n=await N(e,t,r);return n?n.code:e}catch{return e}}var oe=ne;