@youware/vite-plugin-react
Version:
Vite plugin for Youware React applications
17 lines (15 loc) • 5.72 kB
JavaScript
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("path"),E=require("module"),S=require("@babel/parser"),h=require("@babel/types"),m=require("fs");var p=typeof document!="undefined"?document.currentScript:null;function j(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const i in e)if(i!=="default"){const r=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(n,i,r.get?r:{enumerable:!0,get:()=>e[i]})}}return n.default=e,Object.freeze(n)}const t=j(h),w={sourceType:"module",allowImportExportEverywhere:!0,ranges:!0,tokens:!0,plugins:["jsx","typescript"]};function y(e,n){const i=f.relative(process.cwd(),n),r=e.loc,o=r?`${r.start.line}:${r.start.column}`:"unknown",s=`${i}@${o}`;return Buffer.from(s,"utf8").toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}const b=E.createRequire(typeof document=="undefined"?require("url").pathToFileURL(__filename).href:p&&p.tagName.toUpperCase()==="SCRIPT"&&p.src||new URL("index.cjs",document.baseURI).href),v=b("@babel/traverse").default,_=b("@babel/generator").default;function A(e){const n=e.children;if(n.length!==1)return!1;const i=n[0];return t.isJSXText(i)?i.value.trim().length>0:!1}function I(e){return!t.isJSXIdentifier(e.openingElement.name)||e.openingElement.name.name.toLowerCase()!=="img"?!1:!!e.openingElement.attributes.find(r=>t.isJSXAttribute(r)&&t.isJSXIdentifier(r.name)&&r.name.name==="src"&&t.isStringLiteral(r.value))}function J(e){const n=e.openingElement.attributes.find(i=>t.isJSXAttribute(i)&&t.isJSXIdentifier(i.name)&&i.name.name==="style");if(!n)return!0;if(t.isJSXAttribute(n)&&t.isJSXExpressionContainer(n.value)){const i=n.value.expression;return t.isObjectExpression(i)?i.properties.every(r=>{if(t.isObjectProperty(r)){const o=t.isIdentifier(r.key)||t.isStringLiteral(r.key),s=t.isStringLiteral(r.value)||t.isNumericLiteral(r.value);return o&&s}return!1}):!1}return!1}function X(e){return!t.isJSXIdentifier(e.openingElement.name)||e.openingElement.name.name.toLowerCase()!=="a"?!1:!!e.openingElement.attributes.find(r=>t.isJSXAttribute(r)&&t.isJSXIdentifier(r.name)&&r.name.name==="href"&&t.isStringLiteral(r.value))}function C(e){return e.children.some(n=>t.isJSXText(n)&&n.value.trim().length>0)}function P(e,n){e.children=e.children.map(i=>{if(t.isJSXText(i)&&i.value.trim()){const o=y(i,n);return t.jsxElement(t.jsxOpeningElement(t.jsxIdentifier("span"),[t.jsxAttribute(t.jsxIdentifier("data-yw"),t.stringLiteral(o)),t.jsxAttribute(t.jsxIdentifier("data-yw-t"),null),t.jsxAttribute(t.jsxIdentifier("data-yw-auto"),null)],!1),t.jsxClosingElement(t.jsxIdentifier("span")),[t.jsxText(i.value)],!1)}return i})}function O(e,n,i){const r=e.openingElement.attributes;r.push(t.jsxAttribute(t.jsxIdentifier("data-yw"),t.stringLiteral(n))),A(e)?r.push(t.jsxAttribute(t.jsxIdentifier("data-yw-t"),null)):C(e)&&P(e,i),I(e)&&r.push(t.jsxAttribute(t.jsxIdentifier("data-yw-i"),null)),J(e)&&r.push(t.jsxAttribute(t.jsxIdentifier("data-yw-s"),null)),X(e)&&r.push(t.jsxAttribute(t.jsxIdentifier("data-yw-l"),null))}function T(e,n){try{const i=S.parse(e,w);let r=!1;if(v(i,{JSXElement(o){const s=o.node;if(s.openingElement.attributes.some(l=>t.isJSXAttribute(l)&&t.isJSXIdentifier(l.name)&&l.name.name==="data-yw-auto"))return;const c=y(s,n);O(s,c,n),r=!0}}),r){const o=_(i,{retainLines:!0,compact:!1});return{code:o.code,map:o.map}}return null}catch(i){return console.warn(`Error processing JSX elements in file ${n}:`,i),null}}const L=(e,n)=>{const i=f.basename(e);return n.some(r=>i===r)},R=()=>`;
// Visual Editor HMR Bridge - Auto-injected
if (import.meta.hot) {
import.meta.hot.on('vite:beforeUpdate', (payload) => {
if (window.__visualEditorCommunication) {
window.__visualEditorCommunication.handleViteBeforeUpdate(payload);
}
});
import.meta.hot.on('vite:afterUpdate', (payload) => {
if (window.__visualEditorCommunication) {
window.__visualEditorCommunication.handleViteAfterUpdate(payload);
}
});
}
`,x=e=>{let n=e.replace(/\*\*/g,"___DOUBLESTAR___");return n=n.replace(/[.+^${}()|[\]\\]/g,"\\$&"),n=n.replace(/\*/g,"[^/]*"),n=n.replace(/___DOUBLESTAR___/g,".*"),new RegExp(`^${n}$`)},$=(e,n,i)=>i.some(s=>x(s).test(e))?!1:n.some(s=>x(s).test(e));function U(e={}){const{include:n=["**/*.tsx","**/*.jsx"],exclude:i=["node_modules/**","**/dist/**"],entryFiles:r=["main.tsx","main.ts","main.jsx","main.js"]}=e;return{name:"visual-editor-plugin",enforce:"pre",transform(o,s){const u=L(s,r),c=s.endsWith(".tsx")||s.endsWith(".jsx");if(!u&&!c||!(u||$(s,n,i)))return null;try{let a=o,g=null;if(!u||c){const d=T(o,s);d&&(a=d.code,g=d.map)}return u&&(a+=R()),a!==o?{code:a,map:g}:null}catch(a){return console.warn(`Error processing file ${s}:`,a),null}}}}function k(){return{name:"youware-manifest",buildStart(){try{const e=f.resolve(process.cwd(),"yw_manifest.json"),n=f.resolve(process.cwd(),"public","yw_manifest.json");m.existsSync(e)&&(m.mkdirSync(f.dirname(n),{recursive:!0}),m.copyFileSync(e,n))}catch(e){console.error("❌ [Youware Manifest] Copy yw_manifest.json failed:",e)}}}}function M(e={}){const{enableReactVisualEditor:n=!!process.env.YOUWARE_SANDBOX,enableCopyManifest:i=!0}=e,r=[];return i&&r.push(k()),n&&r.push(U(e.reactVisualEditorOptions)),{name:"youware-vite-plugin",enforce:"pre",buildStart(o){for(const s of r)s.buildStart&&typeof s.buildStart=="function"&&s.buildStart.call(this,o)},transform(o,s){let u=o,c=null;for(const l of r)if(l.transform&&typeof l.transform=="function"){const a=l.transform.call(this,u,s);a&&(typeof a=="string"?u=a:a&&typeof a=="object"&&"code"in a&&a.code&&(u=a.code,"map"in a&&(c=a.map)))}return u!==o?{code:u,map:c}:null}}}exports.youwareVitePlugin=M;
;