UNPKG

@open-editor/vue

Version:

Add a _debugSource prop to all Elements

2 lines (1 loc) 5.41 kB
"use strict";var e=require("node:path"),t=require("@open-editor/shared"),r=require("@open-editor/shared/node"),n=require("@open-editor/shared/debugSource"),o=require("unplugin"),i=require("@rollup/pluginutils"),s=require("magic-string"),l=require("@babel/parser"),u=require("@babel/core"),a=require("@vue/compiler-dom");function _define_property(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _object_spread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){_define_property(e,t,r[t])})}return e}function _object_without_properties(e,t){if(null==e)return{};var r,n,o=_object_without_properties_loose(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function _object_without_properties_loose(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}const c="OpenEditorVueUnplugin",p=new Set([a.ElementTypes.ELEMENT,a.ElementTypes.COMPONENT]),d=Object.freeze({type:"template"});function resolveOptions(e){var r,n,o,i;return{rootDir:t.normalizePath(null!=(r=e.rootDir)?r:process.cwd()),sourceMap:null!=(n=e.sourceMap)&&n,include:null!=(o=e.include)?o:/\.(vue|jsx|tsx)$/,exclude:null!=(i=e.exclude)?i:/\/node_modules\//}}function parseID(r,n){let[o,i]=t.normalizePath(r).split("?",2),s=e.relative(n,o),l=e.extname(s).slice(1);return{file:s,isSfc:"vue"===l,isJSX:"jsx"===l,isTsx:"tsx"===l,query:i?_object_spread({},d,Object.fromEntries(new URLSearchParams(i))):d}}function genVue3Inject(){let{defineDebug:e,defineVNode:t}=genDefineCodes("vnode","el",n.DS.VUE_V3);return`;const _debug=vnode.props&&vnode.props.${n.DS.INJECT_PROP};if(_debug){delete vnode.props.${n.DS.INJECT_PROP};vnode.dynamicProps=vnode.dynamicProps&&vnode.dynamicProps.filter((prop)=> prop!=='${n.DS.INJECT_PROP}');${e}}if(typeof vnode.type==='string'){${t}};`}function genVue2Inject(){let{defineDebug:e,defineVNode:t}=genDefineCodes("this","elm",n.DS.VUE_V2);return`;var _debug=this.data&&this.data.attrs&&this.data.attrs.${n.DS.INJECT_PROP};if(_debug){delete this.data.attrs.${n.DS.INJECT_PROP};${e}}if(!this.componentOptions){${t}};`}function genDefineCodes(e,t,r){return{defineDebug:`;Object.defineProperty(${e},${n.DS.SHADOW_PROP},{get(){return _debug;},enumerable:false,});`,defineVNode:`;${r===n.DS.VUE_V2?"var ":"let "}_${t}=${e}.${t};Object.defineProperty(${e},'${t}',{get(){return _${t};},set(${t}){_${t}=${t};if(${t})${t}.${r}=${e};},});`}}function transformTemplate(e,t){walkNodes(e.children,e=>{t(e.props.length>0?Math.max(...e.props.map(e=>e.loc.end.offset)):e.loc.start.offset+e.tag.length+1,e.loc.start.line,e.loc.start.column,!0)})}function walkNodes(e,t){for(let r of e)r.type===a.NodeTypes.ELEMENT&&p.has(r.tagType)&&(t(r),r.children.length&&walkNodes(r.children,t))}function extractScriptJsxOptions(e){var t,r,n;let o=e.children.find(e=>"script"===e.tag);if(!o)return;let i=null==(t=o.children[0])?void 0:t.content,s=null==(n=o.props.find(e=>"lang"===e.name))||null==(r=n.value)?void 0:r.content;if(!i||!/[jt]sx/.test(s||""))return;let l=o.children[0].loc.start;return{code:i,isTsx:"tsx"===s,startIndex:l.offset,startLine:l.line,startColumn:l.column}}function transformJSX(e,t,r){let{isTsx:n=!1,startIndex:o=0,startLine:i=1,startColumn:s=1}=r,a=l.parse(e,{sourceType:"unambiguous",startIndex:o,startLine:i,startColumn:s-1,ranges:!0,plugins:n?["jsx","typescript"]:["jsx"]});u.traverse(a,{JSXOpeningElement({node:e}){let r=e.selfClosing?e.end-2:e.end-1,{line:n,column:o}=e.loc.start;t(r,n,o+1,!1)}})}var f=o.createUnplugin((e={},t)=>{if(!r.isDev())return{name:c};let o="vite"===t.framework,{rootDir:l,sourceMap:u,include:p,exclude:f}=resolveOptions(e),m=i.createFilter(p,f),g=o?["/runtime-core.esm-bundler.js","/deps/vue.js"]:["/runtime-core.cjs.js","/runtime-core.esm-bundler.js","/vue.runtime.esm.js","/vue.runtime.js"],isRuntimeFile=e=>g.some(t=>e.endsWith(t));return{name:c,enforce:"pre",transformInclude(e){let{file:t,query:r}=parseID(e,l);return isRuntimeFile(t)||null==r.raw&&r.type===d.type&&m(t)},transform(e,t){let r=parseID(t,l),{file:i,isSfc:c}=r,p=_object_without_properties(r,["file","isSfc"]);if(isRuntimeFile(i)){if(o&&i.endsWith("/vue.js")){let t=e.match(/\/[\w-]+\.js/g)||[];g.push(...t)}for(let{matchRE:t,injectCode:r}of[{matchRE:/([\s\S]*?function\s+createBaseVNode\b[\s\S]*?\})([\s\S]*)/,injectCode:genVue3Inject},{matchRE:/([\s\S]*?function\s+VNode\b[\s\S]*?)(\}[\s\S]*)/,injectCode:genVue2Inject}]){let n=e.match(t);if(n){let[,e,t]=n;return`${e}${r()}${t}`}}return null}if(e.includes(n.DS.INJECT_PROP))return null;let d=new s(e);function insertDebugProp(e,t,r,o){let s=JSON.stringify({file:i,line:t,column:r}),l=o?` :${n.DS.INJECT_PROP}='${s}'`:` ${n.DS.INJECT_PROP}={${s}}`;d.prependLeft(e,l)}if(c){let t=a.parse(e);transformTemplate(t,insertDebugProp);let r=extractScriptJsxOptions(t);r&&transformJSX(r.code,insertDebugProp,r)}else transformJSX(e,insertDebugProp,p);return d.hasChanged()?{code:d.toString(),map:u?d.generateMap({source:i,file:i}):null}:null}}});exports.unplugin=f;