@lytjs/compat 5.0.1 → 6.4.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/dist/index.cjs CHANGED
@@ -1,21 +1,4 @@
1
- "use strict";var R=Object.defineProperty;var ze=Object.getOwnPropertyDescriptor;var Ge=Object.getOwnPropertyNames;var Ne=Object.prototype.hasOwnProperty;var we=(i,e)=>{for(var t in e)R(i,t,{get:e[t],enumerable:!0})},_e=(i,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ge(e))!Ne.call(i,n)&&n!==t&&R(i,n,{get:()=>e[n],enumerable:!(o=ze(e,n))||o.enumerable});return i};var qe=i=>_e(R({},"__esModule",{value:!0}),i);var Ze={};we(Ze,{Fragment:()=>se,KeepAlive:()=>ke,Suspense:()=>De,Teleport:()=>Ee,Transition:()=>Pe,TransitionGroup:()=>Ie,VueSfcConverter:()=>u,analyzeVueFile:()=>Fe,computed:()=>W,convertVueSfcToLyt:()=>Te,convertVueSfcToLytWithWarnings:()=>x,createApp:()=>Me,createCompatVue:()=>Le,defineAsyncComponent:()=>pe,defineComponent:()=>be,defineEmits:()=>ce,defineExpose:()=>ue,defineProps:()=>ae,effect:()=>O,formatMigrationReport:()=>Oe,getCurrentInstance:()=>ne,getCurrentScope:()=>ie,h:()=>re,inject:()=>z,isProxy:()=>de,isReactive:()=>v,isReadonly:()=>h,isRef:()=>j,markRaw:()=>D,migrateVueFile:()=>Be,nextTick:()=>V,onActivated:()=>Z,onBeforeMount:()=>q,onBeforeUnmount:()=>J,onBeforeUpdate:()=>H,onDeactivated:()=>ee,onErrorCaptured:()=>Q,onMounted:()=>G,onRenderTracked:()=>X,onRenderTriggered:()=>Y,onScopeDispose:()=>oe,onServerPrefetch:()=>te,onUnmounted:()=>_,onUpdated:()=>N,provide:()=>K,proxyRefs:()=>ye,reactive:()=>k,readonly:()=>E,ref:()=>S,shallowReactive:()=>P,shallowRef:()=>T,toRaw:()=>I,toRef:()=>b,toRefs:()=>$,triggerRef:()=>A,unref:()=>M,useAttrs:()=>me,useCompatMode:()=>We,useSlots:()=>fe,useTemplateRef:()=>ge,watch:()=>L,watchEffect:()=>U,watchPostEffect:()=>B,watchSyncEffect:()=>F,withDefaults:()=>le});module.exports=qe(Ze);var ve={};we(ve,{Fragment:()=>se,computed:()=>W,defineAsyncComponent:()=>pe,defineEmits:()=>ce,defineExpose:()=>ue,defineProps:()=>ae,effect:()=>O,getCurrentInstance:()=>ne,getCurrentScope:()=>ie,h:()=>re,inject:()=>z,isProxy:()=>de,isReactive:()=>v,isReadonly:()=>h,isRef:()=>j,markRaw:()=>D,nextTick:()=>V,onActivated:()=>Z,onBeforeMount:()=>q,onBeforeUnmount:()=>J,onBeforeUpdate:()=>H,onDeactivated:()=>ee,onErrorCaptured:()=>Q,onMounted:()=>G,onRenderTracked:()=>X,onRenderTriggered:()=>Y,onScopeDispose:()=>oe,onServerPrefetch:()=>te,onUnmounted:()=>_,onUpdated:()=>N,provide:()=>K,proxyRefs:()=>ye,reactive:()=>k,readonly:()=>E,ref:()=>S,setCurrentInstance:()=>Je,shallowReactive:()=>P,shallowRef:()=>T,toRaw:()=>I,toRef:()=>b,toRefs:()=>$,triggerRef:()=>A,unref:()=>M,useAttrs:()=>me,useSlots:()=>fe,useTemplateRef:()=>ge,watch:()=>L,watchEffect:()=>U,watchPostEffect:()=>B,watchSyncEffect:()=>F,withDefaults:()=>le});var s=require("@lytjs/reactivity"),a=require("@lytjs/component"),y=require("@lytjs/core"),Re=require("@lytjs/component/builtins/async-component"),S=s.ref,T=s.shallowRef,j=s.isRef,M=s.unref,b=s.toRef,$=s.toRefs,A=s.triggerRef,k=s.reactive,E=s.readonly,P=s.shallowReactive,I=s.toRaw,v=s.isReactive,h=s.isReadonly;function D(i){return i.__v_skip=!0,i}var W=s.computed,L=s.watch,U=s.watchEffect;function B(i){return(0,s.watchEffect)(i,{flush:"post"})}function F(i){return(0,s.watchEffect)(i,{flush:"sync"})}var O=s.effect,V=s.nextTick,K=a.provide,z=a.inject,G=a.onMounted,N=a.onUpdated,_=a.onUnmounted,q=a.compositionOnBeforeMount,H=a.onBeforeUpdate,J=a.onBeforeUnmount;function Q(i){}function X(i){}function Y(i){}function Z(i){}function ee(i){}function te(i){}var Se=null,He=null;function ne(){return Se}function Je(i){Se=i}function ie(){return He}function oe(i){}var re=y.h,se=y.Fragment,pe=Re.defineAsyncComponent;function ae(){return{}}var ce=a.defineEmits;function le(i,e){return{...i,...e}}function ue(i){}function fe(){return{}}function me(){return{}}function ge(i){return{value:null}}function de(i){return v(i)||h(i)}function ye(i){return i}var u=class{constructor(e){this.warnings=[];this.content=e}getWarnings(){return[...this.warnings]}addWarning(e,t,o){this.warnings.push({type:e,message:t,suggestion:o})}parse(){let e={template:null,script:null,scriptSetup:null,styles:[],customBlocks:[]},t=this.content.match(/<template[^>]*>([\s\S]*?)<\/template>/);t&&(e.template=t[1].trim());let o=this.content.match(/<script[^>]*setup[^>]*>([\s\S]*?)<\/script>/);if(o&&(e.scriptSetup=o[1].trim()),!e.scriptSetup){let c=this.content.match(/<script(?:\s[^>]*?)?>([\s\S]*?)<\/script>/);c&&(e.script=c[1].trim())}let n=/<style([^>]*)>([\s\S]*?)<\/style>/g,r;for(;(r=n.exec(this.content))!==null;){let c={},f=r[1].match(/(\w+)(?:="([^"]*)")?/g);if(f)for(let l of f){let[d,m]=l.split("=");c[d.trim()]=m?m.replace(/"/g,""):""}e.styles.push({content:r[2].trim(),attrs:c})}let p=/<(template|script|style)([^>]*)>([\s\S]*?)<\/\1>/g,w=this.content.match(/<(\w+)([^>]*)>([\s\S]*?)<\/\1>/g)||[];for(let c of w){let f=c.match(/^<(\w+)/);if(!f)continue;let l=f[1];if(["template","script","style"].includes(l))continue;let d=c.match(new RegExp(`^<${l}[^>]*>([\\s\\S]*?)</${l}>$`));if(!d)continue;let m={},he=c.match(new RegExp(`^<${l}([^>]*)>`));if(he){let xe=he[1].match(/(\w+)(?:="([^"]*)")?/g);if(xe)for(let Ve of xe){let[Ke,Ce]=Ve.split("=");m[Ke.trim()]=Ce?Ce.replace(/"/g,""):""}}e.customBlocks.push({tag:l,content:d[1].trim(),attrs:m})}return e}convertTemplate(e){let t=e;return t=t.replace(/v-for="([^"]*)"/g,'v-each="$1"'),t=t.replace(/:key=/g,"key="),t=t.replace(/v-if=/g,"if="),t=t.replace(/v-else-if=/g,"else-if="),t=t.replace(/v-else/g,"else"),t=t.replace(/v-show=/g,"show="),t=t.replace(/v-html=/g,"html="),t=t.replace(/v-text=/g,"text="),t=t.replace(/\bv-once\b/g,"once"),t=t.replace(/\bv-pre\b/g,"pre"),t=t.replace(/\bv-cloak\b/g,"cloak"),t=t.replace(/v-slot:/g,"slot:"),t=t.replace(/v-on:/g,"on:"),t=t.replace(/v-model\.(\w+)="/g,'model.$1="'),t=t.replace(/v-model="/g,'model="'),t=t.replace(/v-bind:/g,":"),/v-memo/.test(t)&&(this.addWarning("directive","v-memo \u6307\u4EE4\u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301","\u4F7F\u7528 computed \u5C5E\u6027\u66FF\u4EE3\u624B\u52A8\u7F13\u5B58"),t=t.replace(/\s*v-memo="[^"]*"/g,"")),/v-is/.test(t)&&(this.addWarning("directive","v-is \u52A8\u6001\u7EC4\u4EF6\u8BED\u6CD5\u5728 Lyt.js \u4E2D\u53EF\u80FD\u9700\u8981\u8C03\u6574","\u4F7F\u7528 :is \u5C5E\u6027\u66FF\u4EE3 v-is"),t=t.replace(/v-is=/g,":is=")),t}convertScript(e,t=!1){let o=e;return o=o.replace(/from\s+['"]vue['"]/g,"from '@lytjs/compat'"),o=o.replace(/from\s+['"]vue-router['"]/g,"from '@lytjs/router'"),o=o.replace(/from\s+['"]pinia['"]/g,"from '@lytjs/store'"),o=o.replace(/from\s+['"]vuex['"]/g,"from '@lytjs/store'"),t&&(/defineProps/.test(o)&&this.addWarning("api","defineProps \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362\u4E3A defineComponent({ props: {...} })","\u5728 Lyt.js \u4E2D\u4F7F\u7528 defineComponent \u7684 props \u9009\u9879"),/defineEmits/.test(o)&&this.addWarning("api","defineEmits \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362\u4E3A defineComponent({ emits: {...} })","\u5728 Lyt.js \u4E2D\u4F7F\u7528 defineComponent \u7684 emits \u9009\u9879"),/defineExpose/.test(o)&&this.addWarning("api","defineExpose \u5728 Lyt.js \u4E2D\u4E0D\u9700\u8981","\u5728 Lyt.js \u4E2D setup \u8FD4\u56DE\u7684\u5BF9\u8C61\u81EA\u52A8\u66B4\u9732\u4E3A\u516C\u5171\u5C5E\u6027"),/withDefaults/.test(o)&&this.addWarning("api","withDefaults \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362","\u5728 defineComponent \u7684 props \u9009\u9879\u4E2D\u4F7F\u7528 default \u5B57\u6BB5"),/useSlots/.test(o)&&this.addWarning("api","useSlots \u5728 Lyt.js \u4E2D\u9700\u8981\u901A\u8FC7 setup \u4E0A\u4E0B\u6587\u8BBF\u95EE","\u4F7F\u7528 setup(props, { slots }) \u8BBF\u95EE\u63D2\u69FD"),/useAttrs/.test(o)&&this.addWarning("api","useAttrs \u5728 Lyt.js \u4E2D\u9700\u8981\u901A\u8FC7 setup \u4E0A\u4E0B\u6587\u8BBF\u95EE","\u4F7F\u7528 setup(props, { attrs }) \u8BBF\u95EE attrs"),o=this.convertScriptSetupToSetup(o)),o}convertScriptSetupToSetup(e){let t=e;return t=t.replace(/const\s+\w+\s*=\s*defineProps\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] defineProps \u5DF2\u79FB\u9664\uFF0C\u8BF7\u5728 defineComponent({ props: {...} }) \u4E2D\u5B9A\u4E49
2
- `),t=t.replace(/const\s+\w+\s*=\s*defineEmits\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] defineEmits \u5DF2\u79FB\u9664\uFF0C\u8BF7\u5728 defineComponent({ emits: [...] }) \u4E2D\u5B9A\u4E49
3
- `),t=t.replace(/defineExpose\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] defineExpose \u5DF2\u79FB\u9664\uFF0Csetup \u8FD4\u56DE\u503C\u81EA\u52A8\u66B4\u9732
4
- `),t=t.replace(/const\s+\w+\s*=\s*withDefaults\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] withDefaults \u5DF2\u79FB\u9664\uFF0C\u8BF7\u5728 props \u9009\u9879\u4E2D\u4F7F\u7528 default
5
- `),t}convertStyles(e){let t=[];for(let o of e){let n=Object.entries(o.attrs).map(([r,p])=>p?`${r}="${p}"`:r).join(" ");o.attrs.module!==void 0&&this.addWarning("feature","CSS Modules \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301","\u4F7F\u7528 scoped \u6837\u5F0F\u66FF\u4EE3"),t.push(`<style${n?" "+n:""}>
6
- ${o.content}
7
- </style>`)}return t.join(`
1
+ 'use strict';
8
2
 
9
- `)}convert(){let e=this.parse(),t=[];if(e.template){let o=this.convertTemplate(e.template);t.push(`<template>
10
- ${o}
11
- </template>`)}if(e.scriptSetup){let o=this.convertScript(e.scriptSetup,!0);t.push(`<script setup>
12
- ${o}
13
- </script>`)}else if(e.script){let o=this.convertScript(e.script,!1);t.push(`<script>
14
- ${o}
15
- </script>`)}e.styles.length>0&&t.push(this.convertStyles(e.styles));for(let o of e.customBlocks){let n=Object.entries(o.attrs).map(([r,p])=>p?`${r}="${p}"`:r).join(" ");t.push(`<${o.tag}${n?" "+n:""}>
16
- ${o.content}
17
- </${o.tag}>`)}return t.join(`
18
-
19
- `)}convertWithWarnings(){return this.warnings=[],{code:this.convert(),warnings:this.warnings}}};function Te(i){return new u(i).convert()}function x(i){return new u(i).convertWithWarnings()}var je=require("@lytjs/core");function Me(i,e){let t=(0,je.createApp)(i,e);return{...t,use(o,...n){return typeof o=="function"?o(this,...n):o&&typeof o.install=="function"&&o.install(this,...n),this},mixin(o){return this},component(o,n){return n?(t.component(o,n),this):t.component(o)},directive(o,n){return n?this:null},provide(o,n){return t.provide(o,n),this}}}var C=require("@lytjs/component");function be(i){return i&&typeof i=="object"?(0,C.defineComponent)(i):typeof i=="function"?(0,C.defineComponent)({setup:i}):(0,C.defineComponent)(i)}var $e=require("@lytjs/component"),Ae=require("@lytjs/core"),g=$e.defineComponent,ke=g({name:"KeepAlive",setup(i,{slots:e}){return()=>{var t;return(t=e.default)==null?void 0:t.call(e)}}}),Ee=g({name:"Teleport",props:{to:{type:[String,Object],required:!0},disabled:Boolean},setup(i,{slots:e}){return()=>{var t;return(t=e.default)==null?void 0:t.call(e)}}}),Pe=g({name:"Transition",props:{name:{type:String,default:"v"}},setup(i,{slots:e}){return()=>{var t;return(t=e.default)==null?void 0:t.call(e)}}}),Ie=g({name:"TransitionGroup",props:{tag:{type:String,default:"span"},name:{type:String,default:"v"}},setup(i,{slots:e}){return()=>{var t;return(0,Ae.h)(i.tag,null,(t=e.default)==null?void 0:t.call(e))}}}),De=g({name:"Suspense",setup(i,{slots:e}){return()=>{var t;return(t=e.default)==null?void 0:t.call(e)}}});var Qe=!1;function We(i=!0){Qe=i}function Le(){return{...ve,version:"3.x (Compat)"}}function Ue(i){let e=[],t=i.split(`
20
- `);for(let o=0;o<t.length;o++){let n=t[o],r=o+1;/from\s+['"]vue['"]/.test(n)&&e.push({type:"import",severity:"warning",description:'\u4ECE "vue" \u5BFC\u5165\u9700\u8981\u66FF\u6362\u4E3A "@lytjs/compat"',suggestion:'\u5C06 from "vue" \u66FF\u6362\u4E3A from "@lytjs/compat"',line:r,original:n.trim(),replacement:n.trim().replace(/from\s+['"]vue['"]/,"from '@lytjs/compat'")}),/from\s+['"]vue-router['"]/.test(n)&&e.push({type:"ecosystem",severity:"warning",description:"vue-router \u9700\u8981\u66FF\u6362\u4E3A @lytjs/router",suggestion:'\u5C06 from "vue-router" \u66FF\u6362\u4E3A from "@lytjs/router"',line:r,original:n.trim(),replacement:n.trim().replace(/from\s+['"]vue-router['"]/,"from '@lytjs/router'")}),/from\s+['"]pinia['"]/.test(n)&&e.push({type:"ecosystem",severity:"warning",description:"Pinia \u9700\u8981\u66FF\u6362\u4E3A @lytjs/store",suggestion:'\u5C06 from "pinia" \u66FF\u6362\u4E3A from "@lytjs/store"\uFF0C\u5E76\u8C03\u6574 API \u8C03\u7528',line:r,original:n.trim(),replacement:n.trim().replace(/from\s+['"]pinia['"]/,"from '@lytjs/store'")}),/from\s+['"]vuex['"]/.test(n)&&e.push({type:"ecosystem",severity:"warning",description:"Vuex \u9700\u8981\u66FF\u6362\u4E3A @lytjs/store",suggestion:'\u5C06 from "vuex" \u66FF\u6362\u4E3A from "@lytjs/store"\uFF0C\u5E76\u8C03\u6574 API \u8C03\u7528',line:r,original:n.trim(),replacement:n.trim().replace(/from\s+['"]vuex['"]/,"from '@lytjs/store'")}),/v-for=/.test(n)&&e.push({type:"directive",severity:"warning",description:"v-for \u9700\u8981\u8F6C\u6362\u4E3A v-each",suggestion:'\u5C06 v-for="..." \u66FF\u6362\u4E3A v-each="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-for=/,"v-each=")}),/v-if=/.test(n)&&e.push({type:"directive",severity:"info",description:"v-if \u9700\u8981\u8F6C\u6362\u4E3A if",suggestion:'\u5C06 v-if="..." \u66FF\u6362\u4E3A if="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-if=/,"if=")}),/v-else-if=/.test(n)&&e.push({type:"directive",severity:"info",description:"v-else-if \u9700\u8981\u8F6C\u6362\u4E3A else-if",suggestion:'\u5C06 v-else-if="..." \u66FF\u6362\u4E3A else-if="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-else-if=/,"else-if=")}),/\bv-else\b/.test(n)&&e.push({type:"directive",severity:"info",description:"v-else \u9700\u8981\u8F6C\u6362\u4E3A else",suggestion:"\u5C06 v-else \u66FF\u6362\u4E3A else",line:r,original:n.trim(),replacement:n.trim().replace(/\bv-else\b/,"else")}),/v-show=/.test(n)&&e.push({type:"directive",severity:"info",description:"v-show \u9700\u8981\u8F6C\u6362\u4E3A show",suggestion:'\u5C06 v-show="..." \u66FF\u6362\u4E3A show="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-show=/,"show=")}),/v-model/.test(n)&&e.push({type:"directive",severity:"info",description:"v-model \u9700\u8981\u8F6C\u6362\u4E3A model",suggestion:'\u5C06 v-model="..." \u66FF\u6362\u4E3A model="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-model/,"model")}),/v-on:/.test(n)&&e.push({type:"directive",severity:"info",description:"v-on: \u9700\u8981\u8F6C\u6362\u4E3A on:",suggestion:'\u5C06 v-on:click="..." \u66FF\u6362\u4E3A on:click="..." \u6216 @click="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-on:/,"on:")}),/v-bind:/.test(n)&&e.push({type:"directive",severity:"info",description:"v-bind: \u53EF\u4EE5\u7B80\u5199\u4E3A :",suggestion:'\u5C06 v-bind:attr="..." \u66FF\u6362\u4E3A :attr="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-bind:/,":")}),/v-slot:/.test(n)&&e.push({type:"directive",severity:"info",description:"v-slot: \u9700\u8981\u8F6C\u6362\u4E3A slot:",suggestion:"\u5C06 v-slot:name \u66FF\u6362\u4E3A slot:name \u6216 #name",line:r,original:n.trim(),replacement:n.trim().replace(/v-slot:/,"slot:")}),/v-html=/.test(n)&&e.push({type:"directive",severity:"info",description:"v-html \u9700\u8981\u8F6C\u6362\u4E3A html",suggestion:'\u5C06 v-html="..." \u66FF\u6362\u4E3A html="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-html=/,"html=")}),/v-text=/.test(n)&&e.push({type:"directive",severity:"info",description:"v-text \u9700\u8981\u8F6C\u6362\u4E3A text",suggestion:'\u5C06 v-text="..." \u66FF\u6362\u4E3A text="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-text=/,"text=")}),/v-memo/.test(n)&&e.push({type:"feature",severity:"error",description:"v-memo \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 computed \u5C5E\u6027\u66FF\u4EE3\u624B\u52A8\u7F13\u5B58\u903B\u8F91",line:r,original:n.trim()}),/\$refs/.test(n)&&e.push({type:"api",severity:"warning",description:"$refs \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 ref() \u548C\u6A21\u677F ref \u5C5E\u6027\u66FF\u4EE3",line:r,original:n.trim()}),/\$emit/.test(n)&&e.push({type:"api",severity:"warning",description:"$emit \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 setup \u4E0A\u4E0B\u6587\u4E2D\u7684 emit \u51FD\u6570\u66FF\u4EE3",line:r,original:n.trim()}),/\$el/.test(n)&&e.push({type:"api",severity:"warning",description:"$el \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 template ref \u66FF\u4EE3",line:r,original:n.trim()}),/\$parent/.test(n)&&e.push({type:"api",severity:"warning",description:"$parent \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 provide/inject \u66FF\u4EE3",line:r,original:n.trim()}),/\$children/.test(n)&&e.push({type:"api",severity:"error",description:"$children \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 provide/inject \u6216\u4E8B\u4EF6\u603B\u7EBF\u66FF\u4EE3",line:r,original:n.trim()}),/\$forceUpdate/.test(n)&&e.push({type:"api",severity:"warning",description:"$forceUpdate \u5728 Lyt.js \u4E2D\u4E0D\u9700\u8981",suggestion:"Lyt.js \u7684\u54CD\u5E94\u5F0F\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u89E6\u53D1\u66F4\u65B0",line:r,original:n.trim()}),/\$nextTick/.test(n)&&e.push({type:"api",severity:"info",description:"$nextTick \u9700\u8981\u66FF\u6362\u4E3A\u72EC\u7ACB\u7684 nextTick \u51FD\u6570",suggestion:'import { nextTick } from "@lytjs/compat"',line:r,original:n.trim()}),/defineProps/.test(n)&&e.push({type:"api",severity:"warning",description:"defineProps \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362",suggestion:"\u5728 defineComponent({ props: {...} }) \u4E2D\u5B9A\u4E49 props",line:r,original:n.trim()}),/defineEmits/.test(n)&&e.push({type:"api",severity:"warning",description:"defineEmits \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362",suggestion:"\u5728 defineComponent({ emits: [...] }) \u4E2D\u5B9A\u4E49 emits",line:r,original:n.trim()}),/defineExpose/.test(n)&&e.push({type:"api",severity:"info",description:"defineExpose \u5728 Lyt.js \u4E2D\u4E0D\u9700\u8981",suggestion:"setup \u8FD4\u56DE\u503C\u81EA\u52A8\u66B4\u9732\u4E3A\u516C\u5171\u5C5E\u6027",line:r,original:n.trim()}),/<style[^>]*module/.test(n)&&e.push({type:"style",severity:"error",description:"CSS Modules \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 scoped \u6837\u5F0F\u66FF\u4EE3",line:r,original:n.trim()}),/<Teleport/.test(n)&&e.push({type:"component",severity:"info",description:"Teleport \u7EC4\u4EF6\u5DF2\u901A\u8FC7 @lytjs/compat \u63D0\u4F9B",suggestion:"\u786E\u4FDD\u4ECE @lytjs/compat \u5BFC\u5165 Teleport",line:r}),/<Suspense/.test(n)&&e.push({type:"component",severity:"info",description:"Suspense \u7EC4\u4EF6\u5DF2\u901A\u8FC7 @lytjs/compat \u63D0\u4F9B",suggestion:"\u786E\u4FDD\u4ECE @lytjs/compat \u5BFC\u5165 Suspense",line:r}),/<KeepAlive/.test(n)&&e.push({type:"component",severity:"info",description:"KeepAlive \u7EC4\u4EF6\u5DF2\u901A\u8FC7 @lytjs/compat \u63D0\u4F9B",suggestion:"\u786E\u4FDD\u4ECE @lytjs/compat \u5BFC\u5165 KeepAlive",line:r})}return e}function Xe(i){if(i.length===0)return 100;let e=100;for(let t of i)switch(t.severity){case"error":e-=15;break;case"warning":e-=5;break;case"info":e-=1;break}return Math.max(0,Math.min(100,e))}function Ye(i){let e=[],t=new Set;for(let o of i)if(o.severity==="error"||o.severity==="warning"){let n=`${o.type}:${o.description}`;t.has(n)||(t.add(n),e.push(`- [${o.severity.toUpperCase()}] ${o.description}: ${o.suggestion}`))}return e}function Be(i){let e=x(i),t=Ue(i);for(let p of e.warnings)t.push({type:p.type,severity:"warning",description:p.message,suggestion:p.suggestion||""});let o=t.filter(p=>p.severity==="error").length,n=t.filter(p=>p.severity==="warning").length,r=t.filter(p=>p.severity==="info").length;return{code:e.code,issues:t,errorCount:o,warningCount:n,infoCount:r,compatibilityScore:Xe(t),manualFixes:Ye(t)}}function Fe(i){return Ue(i)}function Oe(i){let e=[];if(e.push("========================================"),e.push(" Vue 3 -> Lyt.js \u8FC1\u79FB\u62A5\u544A"),e.push("========================================"),e.push(""),e.push(`\u517C\u5BB9\u6027\u8BC4\u5206: ${i.compatibilityScore}/100`),i.compatibilityScore>=80?e.push("\u8FC1\u79FB\u96BE\u5EA6: \u4F4E - \u5927\u90E8\u5206\u4EE3\u7801\u53EF\u4EE5\u81EA\u52A8\u8F6C\u6362"):i.compatibilityScore>=50?e.push("\u8FC1\u79FB\u96BE\u5EA6: \u4E2D - \u9700\u8981\u4E00\u4E9B\u624B\u52A8\u8C03\u6574"):e.push("\u8FC1\u79FB\u96BE\u5EA6: \u9AD8 - \u9700\u8981\u5927\u91CF\u624B\u52A8\u4FEE\u6539"),e.push(""),e.push("\u95EE\u9898\u7EDF\u8BA1:"),e.push(` \u9519\u8BEF: ${i.errorCount}`),e.push(` \u8B66\u544A: ${i.warningCount}`),e.push(` \u4FE1\u606F: ${i.infoCount}`),e.push(""),i.manualFixes.length>0){e.push("\u9700\u8981\u624B\u52A8\u4FEE\u6539\u7684\u90E8\u5206:");for(let t of i.manualFixes)e.push(` ${t}`);e.push("")}if(i.issues.length>0){e.push("\u8BE6\u7EC6\u95EE\u9898\u5217\u8868:"),e.push("");let t=new Map;for(let n of i.issues){let r=t.get(n.type)||[];r.push(n),t.set(n.type,r)}let o={import:"\u5BFC\u5165\u8BED\u53E5",directive:"\u6307\u4EE4\u8BED\u6CD5",lifecycle:"\u751F\u547D\u5468\u671F",api:"API \u5DEE\u5F02",component:"\u7EC4\u4EF6",style:"\u6837\u5F0F",feature:"\u4E0D\u652F\u6301\u7684\u529F\u80FD",ecosystem:"\u751F\u6001\u7CFB\u7EDF"};for(let[n,r]of t){e.push(` [${o[n]}]`);for(let p of r){let w=p.line?` (\u884C ${p.line})`:"";e.push(` ${p.severity.toUpperCase()}: ${p.description}${w}`),e.push(` \u5EFA\u8BAE: ${p.suggestion}`)}e.push("")}}return e.push("========================================"),e.join(`
21
- `)}0&&(module.exports={Fragment,KeepAlive,Suspense,Teleport,Transition,TransitionGroup,VueSfcConverter,analyzeVueFile,computed,convertVueSfcToLyt,convertVueSfcToLytWithWarnings,createApp,createCompatVue,defineAsyncComponent,defineComponent,defineEmits,defineExpose,defineProps,effect,formatMigrationReport,getCurrentInstance,getCurrentScope,h,inject,isProxy,isReactive,isReadonly,isRef,markRaw,migrateVueFile,nextTick,onActivated,onBeforeMount,onBeforeUnmount,onBeforeUpdate,onDeactivated,onErrorCaptured,onMounted,onRenderTracked,onRenderTriggered,onScopeDispose,onServerPrefetch,onUnmounted,onUpdated,provide,proxyRefs,reactive,readonly,ref,shallowReactive,shallowRef,toRaw,toRef,toRefs,triggerRef,unref,useAttrs,useCompatMode,useSlots,useTemplateRef,watch,watchEffect,watchPostEffect,watchSyncEffect,withDefaults});
3
+ //# sourceMappingURL=index.cjs.map
4
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/index.mjs CHANGED
@@ -1,21 +1,3 @@
1
- var Re=Object.defineProperty;var Se=(i,e)=>{for(var t in e)Re(i,t,{get:e[t],enumerable:!0})};var h={};Se(h,{Fragment:()=>ae,computed:()=>L,defineAsyncComponent:()=>ce,defineEmits:()=>ue,defineExpose:()=>me,defineProps:()=>le,effect:()=>V,getCurrentInstance:()=>oe,getCurrentScope:()=>re,h:()=>pe,inject:()=>G,isProxy:()=>ve,isReactive:()=>y,isReadonly:()=>v,isRef:()=>M,markRaw:()=>W,nextTick:()=>K,onActivated:()=>ee,onBeforeMount:()=>H,onBeforeUnmount:()=>Q,onBeforeUpdate:()=>J,onDeactivated:()=>te,onErrorCaptured:()=>X,onMounted:()=>N,onRenderTracked:()=>Y,onRenderTriggered:()=>Z,onScopeDispose:()=>se,onServerPrefetch:()=>ne,onUnmounted:()=>q,onUpdated:()=>_,provide:()=>z,proxyRefs:()=>he,reactive:()=>E,readonly:()=>P,ref:()=>T,setCurrentInstance:()=>et,shallowReactive:()=>I,shallowRef:()=>j,toRaw:()=>D,toRef:()=>$,toRefs:()=>A,triggerRef:()=>k,unref:()=>b,useAttrs:()=>de,useSlots:()=>ge,useTemplateRef:()=>ye,watch:()=>U,watchEffect:()=>B,watchPostEffect:()=>F,watchSyncEffect:()=>O,withDefaults:()=>fe});import{ref as Te,shallowRef as je,isRef as Me,unref as be,toRef as $e,toRefs as Ae,triggerRef as ke,reactive as Ee,readonly as Pe,shallowReactive as Ie,toRaw as De,isReactive as We,isReadonly as Le,computed as Ue,watch as Be,watchEffect as d,effect as Fe,nextTick as Oe}from"@lytjs/reactivity";import{provide as Ve,inject as Ke,onMounted as ze,onUpdated as Ge,onUnmounted as Ne,compositionOnBeforeMount as _e,onBeforeUpdate as qe,onBeforeUnmount as He,defineEmits as Je}from"@lytjs/component";import{h as Qe,Fragment as Xe}from"@lytjs/core";import{defineAsyncComponent as Ye}from"@lytjs/component/builtins/async-component";var T=Te,j=je,M=Me,b=be,$=$e,A=Ae,k=ke,E=Ee,P=Pe,I=Ie,D=De,y=We,v=Le;function W(i){return i.__v_skip=!0,i}var L=Ue,U=Be,B=d;function F(i){return d(i,{flush:"post"})}function O(i){return d(i,{flush:"sync"})}var V=Fe,K=Oe,z=Ve,G=Ke,N=ze,_=Ge,q=Ne,H=_e,J=qe,Q=He;function X(i){}function Y(i){}function Z(i){}function ee(i){}function te(i){}function ne(i){}var ie=null,Ze=null;function oe(){return ie}function et(i){ie=i}function re(){return Ze}function se(i){}var pe=Qe,ae=Xe,ce=Ye;function le(){return{}}var ue=Je;function fe(i,e){return{...i,...e}}function me(i){}function ge(){return{}}function de(){return{}}function ye(i){return{value:null}}function ve(i){return y(i)||v(i)}function he(i){return i}var u=class{constructor(e){this.warnings=[];this.content=e}getWarnings(){return[...this.warnings]}addWarning(e,t,o){this.warnings.push({type:e,message:t,suggestion:o})}parse(){let e={template:null,script:null,scriptSetup:null,styles:[],customBlocks:[]},t=this.content.match(/<template[^>]*>([\s\S]*?)<\/template>/);t&&(e.template=t[1].trim());let o=this.content.match(/<script[^>]*setup[^>]*>([\s\S]*?)<\/script>/);if(o&&(e.scriptSetup=o[1].trim()),!e.scriptSetup){let p=this.content.match(/<script(?:\s[^>]*?)?>([\s\S]*?)<\/script>/);p&&(e.script=p[1].trim())}let n=/<style([^>]*)>([\s\S]*?)<\/style>/g,r;for(;(r=n.exec(this.content))!==null;){let p={},c=r[1].match(/(\w+)(?:="([^"]*)")?/g);if(c)for(let a of c){let[m,l]=a.split("=");p[m.trim()]=l?l.replace(/"/g,""):""}e.styles.push({content:r[2].trim(),attrs:p})}let s=/<(template|script|style)([^>]*)>([\s\S]*?)<\/\1>/g,g=this.content.match(/<(\w+)([^>]*)>([\s\S]*?)<\/\1>/g)||[];for(let p of g){let c=p.match(/^<(\w+)/);if(!c)continue;let a=c[1];if(["template","script","style"].includes(a))continue;let m=p.match(new RegExp(`^<${a}[^>]*>([\\s\\S]*?)</${a}>$`));if(!m)continue;let l={},w=p.match(new RegExp(`^<${a}([^>]*)>`));if(w){let R=w[1].match(/(\w+)(?:="([^"]*)")?/g);if(R)for(let Ce of R){let[we,S]=Ce.split("=");l[we.trim()]=S?S.replace(/"/g,""):""}}e.customBlocks.push({tag:a,content:m[1].trim(),attrs:l})}return e}convertTemplate(e){let t=e;return t=t.replace(/v-for="([^"]*)"/g,'v-each="$1"'),t=t.replace(/:key=/g,"key="),t=t.replace(/v-if=/g,"if="),t=t.replace(/v-else-if=/g,"else-if="),t=t.replace(/v-else/g,"else"),t=t.replace(/v-show=/g,"show="),t=t.replace(/v-html=/g,"html="),t=t.replace(/v-text=/g,"text="),t=t.replace(/\bv-once\b/g,"once"),t=t.replace(/\bv-pre\b/g,"pre"),t=t.replace(/\bv-cloak\b/g,"cloak"),t=t.replace(/v-slot:/g,"slot:"),t=t.replace(/v-on:/g,"on:"),t=t.replace(/v-model\.(\w+)="/g,'model.$1="'),t=t.replace(/v-model="/g,'model="'),t=t.replace(/v-bind:/g,":"),/v-memo/.test(t)&&(this.addWarning("directive","v-memo \u6307\u4EE4\u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301","\u4F7F\u7528 computed \u5C5E\u6027\u66FF\u4EE3\u624B\u52A8\u7F13\u5B58"),t=t.replace(/\s*v-memo="[^"]*"/g,"")),/v-is/.test(t)&&(this.addWarning("directive","v-is \u52A8\u6001\u7EC4\u4EF6\u8BED\u6CD5\u5728 Lyt.js \u4E2D\u53EF\u80FD\u9700\u8981\u8C03\u6574","\u4F7F\u7528 :is \u5C5E\u6027\u66FF\u4EE3 v-is"),t=t.replace(/v-is=/g,":is=")),t}convertScript(e,t=!1){let o=e;return o=o.replace(/from\s+['"]vue['"]/g,"from '@lytjs/compat'"),o=o.replace(/from\s+['"]vue-router['"]/g,"from '@lytjs/router'"),o=o.replace(/from\s+['"]pinia['"]/g,"from '@lytjs/store'"),o=o.replace(/from\s+['"]vuex['"]/g,"from '@lytjs/store'"),t&&(/defineProps/.test(o)&&this.addWarning("api","defineProps \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362\u4E3A defineComponent({ props: {...} })","\u5728 Lyt.js \u4E2D\u4F7F\u7528 defineComponent \u7684 props \u9009\u9879"),/defineEmits/.test(o)&&this.addWarning("api","defineEmits \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362\u4E3A defineComponent({ emits: {...} })","\u5728 Lyt.js \u4E2D\u4F7F\u7528 defineComponent \u7684 emits \u9009\u9879"),/defineExpose/.test(o)&&this.addWarning("api","defineExpose \u5728 Lyt.js \u4E2D\u4E0D\u9700\u8981","\u5728 Lyt.js \u4E2D setup \u8FD4\u56DE\u7684\u5BF9\u8C61\u81EA\u52A8\u66B4\u9732\u4E3A\u516C\u5171\u5C5E\u6027"),/withDefaults/.test(o)&&this.addWarning("api","withDefaults \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362","\u5728 defineComponent \u7684 props \u9009\u9879\u4E2D\u4F7F\u7528 default \u5B57\u6BB5"),/useSlots/.test(o)&&this.addWarning("api","useSlots \u5728 Lyt.js \u4E2D\u9700\u8981\u901A\u8FC7 setup \u4E0A\u4E0B\u6587\u8BBF\u95EE","\u4F7F\u7528 setup(props, { slots }) \u8BBF\u95EE\u63D2\u69FD"),/useAttrs/.test(o)&&this.addWarning("api","useAttrs \u5728 Lyt.js \u4E2D\u9700\u8981\u901A\u8FC7 setup \u4E0A\u4E0B\u6587\u8BBF\u95EE","\u4F7F\u7528 setup(props, { attrs }) \u8BBF\u95EE attrs"),o=this.convertScriptSetupToSetup(o)),o}convertScriptSetupToSetup(e){let t=e;return t=t.replace(/const\s+\w+\s*=\s*defineProps\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] defineProps \u5DF2\u79FB\u9664\uFF0C\u8BF7\u5728 defineComponent({ props: {...} }) \u4E2D\u5B9A\u4E49
2
- `),t=t.replace(/const\s+\w+\s*=\s*defineEmits\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] defineEmits \u5DF2\u79FB\u9664\uFF0C\u8BF7\u5728 defineComponent({ emits: [...] }) \u4E2D\u5B9A\u4E49
3
- `),t=t.replace(/defineExpose\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] defineExpose \u5DF2\u79FB\u9664\uFF0Csetup \u8FD4\u56DE\u503C\u81EA\u52A8\u66B4\u9732
4
- `),t=t.replace(/const\s+\w+\s*=\s*withDefaults\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] withDefaults \u5DF2\u79FB\u9664\uFF0C\u8BF7\u5728 props \u9009\u9879\u4E2D\u4F7F\u7528 default
5
- `),t}convertStyles(e){let t=[];for(let o of e){let n=Object.entries(o.attrs).map(([r,s])=>s?`${r}="${s}"`:r).join(" ");o.attrs.module!==void 0&&this.addWarning("feature","CSS Modules \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301","\u4F7F\u7528 scoped \u6837\u5F0F\u66FF\u4EE3"),t.push(`<style${n?" "+n:""}>
6
- ${o.content}
7
- </style>`)}return t.join(`
8
1
 
9
- `)}convert(){let e=this.parse(),t=[];if(e.template){let o=this.convertTemplate(e.template);t.push(`<template>
10
- ${o}
11
- </template>`)}if(e.scriptSetup){let o=this.convertScript(e.scriptSetup,!0);t.push(`<script setup>
12
- ${o}
13
- </script>`)}else if(e.script){let o=this.convertScript(e.script,!1);t.push(`<script>
14
- ${o}
15
- </script>`)}e.styles.length>0&&t.push(this.convertStyles(e.styles));for(let o of e.customBlocks){let n=Object.entries(o.attrs).map(([r,s])=>s?`${r}="${s}"`:r).join(" ");t.push(`<${o.tag}${n?" "+n:""}>
16
- ${o.content}
17
- </${o.tag}>`)}return t.join(`
18
-
19
- `)}convertWithWarnings(){return this.warnings=[],{code:this.convert(),warnings:this.warnings}}};function tt(i){return new u(i).convert()}function x(i){return new u(i).convertWithWarnings()}import{createApp as nt}from"@lytjs/core";function it(i,e){let t=nt(i,e);return{...t,use(o,...n){return typeof o=="function"?o(this,...n):o&&typeof o.install=="function"&&o.install(this,...n),this},mixin(o){return this},component(o,n){return n?(t.component(o,n),this):t.component(o)},directive(o,n){return n?this:null},provide(o,n){return t.provide(o,n),this}}}import{defineComponent as C}from"@lytjs/component";function ot(i){return i&&typeof i=="object"?C(i):typeof i=="function"?C({setup:i}):C(i)}import{defineComponent as rt}from"@lytjs/component";import{h as st}from"@lytjs/core";var f=rt,pt=f({name:"KeepAlive",setup(i,{slots:e}){return()=>{var t;return(t=e.default)==null?void 0:t.call(e)}}}),at=f({name:"Teleport",props:{to:{type:[String,Object],required:!0},disabled:Boolean},setup(i,{slots:e}){return()=>{var t;return(t=e.default)==null?void 0:t.call(e)}}}),ct=f({name:"Transition",props:{name:{type:String,default:"v"}},setup(i,{slots:e}){return()=>{var t;return(t=e.default)==null?void 0:t.call(e)}}}),lt=f({name:"TransitionGroup",props:{tag:{type:String,default:"span"},name:{type:String,default:"v"}},setup(i,{slots:e}){return()=>{var t;return st(i.tag,null,(t=e.default)==null?void 0:t.call(e))}}}),ut=f({name:"Suspense",setup(i,{slots:e}){return()=>{var t;return(t=e.default)==null?void 0:t.call(e)}}});var ft=!1;function mt(i=!0){ft=i}function gt(){return{...h,version:"3.x (Compat)"}}function xe(i){let e=[],t=i.split(`
20
- `);for(let o=0;o<t.length;o++){let n=t[o],r=o+1;/from\s+['"]vue['"]/.test(n)&&e.push({type:"import",severity:"warning",description:'\u4ECE "vue" \u5BFC\u5165\u9700\u8981\u66FF\u6362\u4E3A "@lytjs/compat"',suggestion:'\u5C06 from "vue" \u66FF\u6362\u4E3A from "@lytjs/compat"',line:r,original:n.trim(),replacement:n.trim().replace(/from\s+['"]vue['"]/,"from '@lytjs/compat'")}),/from\s+['"]vue-router['"]/.test(n)&&e.push({type:"ecosystem",severity:"warning",description:"vue-router \u9700\u8981\u66FF\u6362\u4E3A @lytjs/router",suggestion:'\u5C06 from "vue-router" \u66FF\u6362\u4E3A from "@lytjs/router"',line:r,original:n.trim(),replacement:n.trim().replace(/from\s+['"]vue-router['"]/,"from '@lytjs/router'")}),/from\s+['"]pinia['"]/.test(n)&&e.push({type:"ecosystem",severity:"warning",description:"Pinia \u9700\u8981\u66FF\u6362\u4E3A @lytjs/store",suggestion:'\u5C06 from "pinia" \u66FF\u6362\u4E3A from "@lytjs/store"\uFF0C\u5E76\u8C03\u6574 API \u8C03\u7528',line:r,original:n.trim(),replacement:n.trim().replace(/from\s+['"]pinia['"]/,"from '@lytjs/store'")}),/from\s+['"]vuex['"]/.test(n)&&e.push({type:"ecosystem",severity:"warning",description:"Vuex \u9700\u8981\u66FF\u6362\u4E3A @lytjs/store",suggestion:'\u5C06 from "vuex" \u66FF\u6362\u4E3A from "@lytjs/store"\uFF0C\u5E76\u8C03\u6574 API \u8C03\u7528',line:r,original:n.trim(),replacement:n.trim().replace(/from\s+['"]vuex['"]/,"from '@lytjs/store'")}),/v-for=/.test(n)&&e.push({type:"directive",severity:"warning",description:"v-for \u9700\u8981\u8F6C\u6362\u4E3A v-each",suggestion:'\u5C06 v-for="..." \u66FF\u6362\u4E3A v-each="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-for=/,"v-each=")}),/v-if=/.test(n)&&e.push({type:"directive",severity:"info",description:"v-if \u9700\u8981\u8F6C\u6362\u4E3A if",suggestion:'\u5C06 v-if="..." \u66FF\u6362\u4E3A if="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-if=/,"if=")}),/v-else-if=/.test(n)&&e.push({type:"directive",severity:"info",description:"v-else-if \u9700\u8981\u8F6C\u6362\u4E3A else-if",suggestion:'\u5C06 v-else-if="..." \u66FF\u6362\u4E3A else-if="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-else-if=/,"else-if=")}),/\bv-else\b/.test(n)&&e.push({type:"directive",severity:"info",description:"v-else \u9700\u8981\u8F6C\u6362\u4E3A else",suggestion:"\u5C06 v-else \u66FF\u6362\u4E3A else",line:r,original:n.trim(),replacement:n.trim().replace(/\bv-else\b/,"else")}),/v-show=/.test(n)&&e.push({type:"directive",severity:"info",description:"v-show \u9700\u8981\u8F6C\u6362\u4E3A show",suggestion:'\u5C06 v-show="..." \u66FF\u6362\u4E3A show="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-show=/,"show=")}),/v-model/.test(n)&&e.push({type:"directive",severity:"info",description:"v-model \u9700\u8981\u8F6C\u6362\u4E3A model",suggestion:'\u5C06 v-model="..." \u66FF\u6362\u4E3A model="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-model/,"model")}),/v-on:/.test(n)&&e.push({type:"directive",severity:"info",description:"v-on: \u9700\u8981\u8F6C\u6362\u4E3A on:",suggestion:'\u5C06 v-on:click="..." \u66FF\u6362\u4E3A on:click="..." \u6216 @click="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-on:/,"on:")}),/v-bind:/.test(n)&&e.push({type:"directive",severity:"info",description:"v-bind: \u53EF\u4EE5\u7B80\u5199\u4E3A :",suggestion:'\u5C06 v-bind:attr="..." \u66FF\u6362\u4E3A :attr="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-bind:/,":")}),/v-slot:/.test(n)&&e.push({type:"directive",severity:"info",description:"v-slot: \u9700\u8981\u8F6C\u6362\u4E3A slot:",suggestion:"\u5C06 v-slot:name \u66FF\u6362\u4E3A slot:name \u6216 #name",line:r,original:n.trim(),replacement:n.trim().replace(/v-slot:/,"slot:")}),/v-html=/.test(n)&&e.push({type:"directive",severity:"info",description:"v-html \u9700\u8981\u8F6C\u6362\u4E3A html",suggestion:'\u5C06 v-html="..." \u66FF\u6362\u4E3A html="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-html=/,"html=")}),/v-text=/.test(n)&&e.push({type:"directive",severity:"info",description:"v-text \u9700\u8981\u8F6C\u6362\u4E3A text",suggestion:'\u5C06 v-text="..." \u66FF\u6362\u4E3A text="..."',line:r,original:n.trim(),replacement:n.trim().replace(/v-text=/,"text=")}),/v-memo/.test(n)&&e.push({type:"feature",severity:"error",description:"v-memo \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 computed \u5C5E\u6027\u66FF\u4EE3\u624B\u52A8\u7F13\u5B58\u903B\u8F91",line:r,original:n.trim()}),/\$refs/.test(n)&&e.push({type:"api",severity:"warning",description:"$refs \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 ref() \u548C\u6A21\u677F ref \u5C5E\u6027\u66FF\u4EE3",line:r,original:n.trim()}),/\$emit/.test(n)&&e.push({type:"api",severity:"warning",description:"$emit \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 setup \u4E0A\u4E0B\u6587\u4E2D\u7684 emit \u51FD\u6570\u66FF\u4EE3",line:r,original:n.trim()}),/\$el/.test(n)&&e.push({type:"api",severity:"warning",description:"$el \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 template ref \u66FF\u4EE3",line:r,original:n.trim()}),/\$parent/.test(n)&&e.push({type:"api",severity:"warning",description:"$parent \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 provide/inject \u66FF\u4EE3",line:r,original:n.trim()}),/\$children/.test(n)&&e.push({type:"api",severity:"error",description:"$children \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 provide/inject \u6216\u4E8B\u4EF6\u603B\u7EBF\u66FF\u4EE3",line:r,original:n.trim()}),/\$forceUpdate/.test(n)&&e.push({type:"api",severity:"warning",description:"$forceUpdate \u5728 Lyt.js \u4E2D\u4E0D\u9700\u8981",suggestion:"Lyt.js \u7684\u54CD\u5E94\u5F0F\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u89E6\u53D1\u66F4\u65B0",line:r,original:n.trim()}),/\$nextTick/.test(n)&&e.push({type:"api",severity:"info",description:"$nextTick \u9700\u8981\u66FF\u6362\u4E3A\u72EC\u7ACB\u7684 nextTick \u51FD\u6570",suggestion:'import { nextTick } from "@lytjs/compat"',line:r,original:n.trim()}),/defineProps/.test(n)&&e.push({type:"api",severity:"warning",description:"defineProps \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362",suggestion:"\u5728 defineComponent({ props: {...} }) \u4E2D\u5B9A\u4E49 props",line:r,original:n.trim()}),/defineEmits/.test(n)&&e.push({type:"api",severity:"warning",description:"defineEmits \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362",suggestion:"\u5728 defineComponent({ emits: [...] }) \u4E2D\u5B9A\u4E49 emits",line:r,original:n.trim()}),/defineExpose/.test(n)&&e.push({type:"api",severity:"info",description:"defineExpose \u5728 Lyt.js \u4E2D\u4E0D\u9700\u8981",suggestion:"setup \u8FD4\u56DE\u503C\u81EA\u52A8\u66B4\u9732\u4E3A\u516C\u5171\u5C5E\u6027",line:r,original:n.trim()}),/<style[^>]*module/.test(n)&&e.push({type:"style",severity:"error",description:"CSS Modules \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301",suggestion:"\u4F7F\u7528 scoped \u6837\u5F0F\u66FF\u4EE3",line:r,original:n.trim()}),/<Teleport/.test(n)&&e.push({type:"component",severity:"info",description:"Teleport \u7EC4\u4EF6\u5DF2\u901A\u8FC7 @lytjs/compat \u63D0\u4F9B",suggestion:"\u786E\u4FDD\u4ECE @lytjs/compat \u5BFC\u5165 Teleport",line:r}),/<Suspense/.test(n)&&e.push({type:"component",severity:"info",description:"Suspense \u7EC4\u4EF6\u5DF2\u901A\u8FC7 @lytjs/compat \u63D0\u4F9B",suggestion:"\u786E\u4FDD\u4ECE @lytjs/compat \u5BFC\u5165 Suspense",line:r}),/<KeepAlive/.test(n)&&e.push({type:"component",severity:"info",description:"KeepAlive \u7EC4\u4EF6\u5DF2\u901A\u8FC7 @lytjs/compat \u63D0\u4F9B",suggestion:"\u786E\u4FDD\u4ECE @lytjs/compat \u5BFC\u5165 KeepAlive",line:r})}return e}function dt(i){if(i.length===0)return 100;let e=100;for(let t of i)switch(t.severity){case"error":e-=15;break;case"warning":e-=5;break;case"info":e-=1;break}return Math.max(0,Math.min(100,e))}function yt(i){let e=[],t=new Set;for(let o of i)if(o.severity==="error"||o.severity==="warning"){let n=`${o.type}:${o.description}`;t.has(n)||(t.add(n),e.push(`- [${o.severity.toUpperCase()}] ${o.description}: ${o.suggestion}`))}return e}function vt(i){let e=x(i),t=xe(i);for(let s of e.warnings)t.push({type:s.type,severity:"warning",description:s.message,suggestion:s.suggestion||""});let o=t.filter(s=>s.severity==="error").length,n=t.filter(s=>s.severity==="warning").length,r=t.filter(s=>s.severity==="info").length;return{code:e.code,issues:t,errorCount:o,warningCount:n,infoCount:r,compatibilityScore:dt(t),manualFixes:yt(t)}}function ht(i){return xe(i)}function xt(i){let e=[];if(e.push("========================================"),e.push(" Vue 3 -> Lyt.js \u8FC1\u79FB\u62A5\u544A"),e.push("========================================"),e.push(""),e.push(`\u517C\u5BB9\u6027\u8BC4\u5206: ${i.compatibilityScore}/100`),i.compatibilityScore>=80?e.push("\u8FC1\u79FB\u96BE\u5EA6: \u4F4E - \u5927\u90E8\u5206\u4EE3\u7801\u53EF\u4EE5\u81EA\u52A8\u8F6C\u6362"):i.compatibilityScore>=50?e.push("\u8FC1\u79FB\u96BE\u5EA6: \u4E2D - \u9700\u8981\u4E00\u4E9B\u624B\u52A8\u8C03\u6574"):e.push("\u8FC1\u79FB\u96BE\u5EA6: \u9AD8 - \u9700\u8981\u5927\u91CF\u624B\u52A8\u4FEE\u6539"),e.push(""),e.push("\u95EE\u9898\u7EDF\u8BA1:"),e.push(` \u9519\u8BEF: ${i.errorCount}`),e.push(` \u8B66\u544A: ${i.warningCount}`),e.push(` \u4FE1\u606F: ${i.infoCount}`),e.push(""),i.manualFixes.length>0){e.push("\u9700\u8981\u624B\u52A8\u4FEE\u6539\u7684\u90E8\u5206:");for(let t of i.manualFixes)e.push(` ${t}`);e.push("")}if(i.issues.length>0){e.push("\u8BE6\u7EC6\u95EE\u9898\u5217\u8868:"),e.push("");let t=new Map;for(let n of i.issues){let r=t.get(n.type)||[];r.push(n),t.set(n.type,r)}let o={import:"\u5BFC\u5165\u8BED\u53E5",directive:"\u6307\u4EE4\u8BED\u6CD5",lifecycle:"\u751F\u547D\u5468\u671F",api:"API \u5DEE\u5F02",component:"\u7EC4\u4EF6",style:"\u6837\u5F0F",feature:"\u4E0D\u652F\u6301\u7684\u529F\u80FD",ecosystem:"\u751F\u6001\u7CFB\u7EDF"};for(let[n,r]of t){e.push(` [${o[n]}]`);for(let s of r){let g=s.line?` (\u884C ${s.line})`:"";e.push(` ${s.severity.toUpperCase()}: ${s.description}${g}`),e.push(` \u5EFA\u8BAE: ${s.suggestion}`)}e.push("")}}return e.push("========================================"),e.join(`
21
- `)}export{ae as Fragment,pt as KeepAlive,ut as Suspense,at as Teleport,ct as Transition,lt as TransitionGroup,u as VueSfcConverter,ht as analyzeVueFile,L as computed,tt as convertVueSfcToLyt,x as convertVueSfcToLytWithWarnings,it as createApp,gt as createCompatVue,ce as defineAsyncComponent,ot as defineComponent,ue as defineEmits,me as defineExpose,le as defineProps,V as effect,xt as formatMigrationReport,oe as getCurrentInstance,re as getCurrentScope,pe as h,G as inject,ve as isProxy,y as isReactive,v as isReadonly,M as isRef,W as markRaw,vt as migrateVueFile,K as nextTick,ee as onActivated,H as onBeforeMount,Q as onBeforeUnmount,J as onBeforeUpdate,te as onDeactivated,X as onErrorCaptured,N as onMounted,Y as onRenderTracked,Z as onRenderTriggered,se as onScopeDispose,ne as onServerPrefetch,q as onUnmounted,_ as onUpdated,z as provide,he as proxyRefs,E as reactive,P as readonly,T as ref,I as shallowReactive,j as shallowRef,D as toRaw,$ as toRef,A as toRefs,k as triggerRef,b as unref,de as useAttrs,mt as useCompatMode,ge as useSlots,ye as useTemplateRef,U as watch,B as watchEffect,F as watchPostEffect,O as watchSyncEffect,fe as withDefaults};
2
+ //# sourceMappingURL=index.mjs.map
3
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
package/package.json CHANGED
@@ -1,48 +1,52 @@
1
1
  {
2
2
  "name": "@lytjs/compat",
3
- "version": "5.0.1",
4
- "description": "Lyt.js Vue 3 兼容层 - 提供与 Vue 3 兼容的 API 和工具",
3
+ "version": "6.4.0",
4
+ "description": "LytJS Vue 2/3 compatibility layer for migration support",
5
+ "type": "module",
5
6
  "main": "./dist/index.cjs",
6
7
  "module": "./dist/index.mjs",
7
- "types": "./dist/types/index.d.ts",
8
+ "types": "./dist/index.d.ts",
8
9
  "exports": {
9
10
  ".": {
10
- "types": "./dist/types/index.d.ts",
11
+ "types": "./dist/index.d.ts",
11
12
  "import": "./dist/index.mjs",
12
- "require": "./dist/index.cjs",
13
- "default": "./dist/index.mjs"
14
- }
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./package.json": "./package.json"
15
16
  },
16
- "bin": {
17
- "vue-to-lyt": "./dist/bin/vue-to-lyt.js"
18
- },
19
- "sideEffects": false,
20
17
  "files": [
21
18
  "dist"
22
19
  ],
20
+ "sideEffects": false,
21
+ "scripts": {
22
+ "build": "tsup",
23
+ "dev": "tsup --watch",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "type-check": "tsc --noEmit",
27
+ "lint": "eslint \"src/**/*.ts\" \"tests/**/*.ts\"",
28
+ "clean": "rm -rf dist"
29
+ },
30
+ "dependencies": {
31
+ "@lytjs/reactivity": "^6.0.0",
32
+ "@lytjs/component": "^6.0.0",
33
+ "@lytjs/core": "^6.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "tsup": "^8.0.0",
37
+ "typescript": "^5.4.0",
38
+ "vitest": "^3.0.0"
39
+ },
23
40
  "license": "MIT",
24
- "author": "lytjs",
25
41
  "repository": {
26
42
  "type": "git",
27
- "url": "https://gitee.com/lytjs/lytjs"
43
+ "url": "https://gitee.com/lytjs/lytjs.git",
44
+ "directory": "packages/ecosystem/packages/compat"
28
45
  },
29
- "homepage": "https://gitee.com/lytjs/lytjs",
30
46
  "keywords": [
31
- "lyt",
32
47
  "lytjs",
33
- "vue",
34
- "vue3",
35
- "compatibility",
48
+ "compat",
36
49
  "migration",
37
- "frontend",
38
- "framework"
39
- ],
40
- "publishConfig": {
41
- "access": "public"
42
- },
43
- "dependencies": {
44
- "@lytjs/core": "^5.0.1",
45
- "@lytjs/reactivity": "^5.0.1",
46
- "@lytjs/component": "^5.0.1"
47
- }
50
+ "vue"
51
+ ]
48
52
  }
package/README.md DELETED
@@ -1,314 +0,0 @@
1
- # @lytjs/compat
2
-
3
- Lyt.js Vue 3 兼容层 - 让 Vue 3 用户可以无缝迁移到 Lyt.js。
4
-
5
- ## 安装
6
-
7
- ```bash
8
- npm install @lytjs/compat
9
-
10
- # 或使用 pnpm
11
- pnpm add @lytjs/compat
12
- ```
13
-
14
- ## 特性
15
-
16
- - 🚀 完全兼容 Vue 3 API
17
- - 📦 SFC 文件转换器
18
- - 🔄 自动迁移工具
19
- - 💡 渐进式迁移策略
20
- - 🎯 零运行时依赖
21
-
22
- ## 快速开始
23
-
24
- ### 迁移工具
25
-
26
- ```bash
27
- # 转换单个文件
28
- vue-to-lyt src/App.vue
29
-
30
- # 转换整个目录
31
- vue-to-lyt src/components/
32
- ```
33
-
34
- ### 在代码中使用
35
-
36
- ```javascript
37
- // 从 'vue' 改为 '@lytjs/compat'
38
- import { ref, computed, watch, createApp } from '@lytjs/compat';
39
-
40
- // 代码完全相同!
41
- const count = ref(0);
42
- const doubled = computed(() => count.value * 2);
43
- watch(count, (newVal) => console.log(newVal));
44
-
45
- createApp(App).mount('#app');
46
- ```
47
-
48
- ## API 兼容性
49
-
50
- ### 响应式 API(完全兼容)
51
-
52
- ```javascript
53
- import {
54
- ref, shallowRef, toRef, toRefs, unref,
55
- reactive, readonly, shallowReactive,
56
- computed,
57
- watch, watchEffect, watchPostEffect, watchSyncEffect,
58
- effect, stop,
59
- provide, inject,
60
- nextTick
61
- } from '@lytjs/compat';
62
- ```
63
-
64
- ### 组件选项(完全兼容)
65
-
66
- ```javascript
67
- import { defineComponent, defineAsyncComponent } from '@lytjs/compat';
68
-
69
- const Component = defineComponent({
70
- props: {},
71
- emits: [],
72
- setup(props, context) {
73
- return {};
74
- },
75
- data() { return {}; },
76
- computed: {},
77
- methods: {},
78
- watch: {},
79
- components: {},
80
- directives: {}
81
- });
82
- ```
83
-
84
- ### 生命周期钩子(完全兼容)
85
-
86
- ```javascript
87
- import {
88
- onBeforeMount, onMounted,
89
- onBeforeUpdate, onUpdated,
90
- onBeforeUnmount, onUnmounted,
91
- onErrorCaptured,
92
- onRenderTracked, onRenderTriggered,
93
- onActivated, onDeactivated,
94
- onServerPrefetch
95
- } from '@lytjs/compat';
96
- ```
97
-
98
- ## SFC 转换
99
-
100
- 转换前后对比:
101
-
102
- ```vue
103
- <!-- 转换前 (Vue SFC) -->
104
- <template>
105
- <div>
106
- <h1>{{ title }}</h1>
107
- <button v-if="showButton" @click="handleClick">
108
- Click me
109
- </button>
110
- <ul>
111
- <li v-for="item in items" :key="item.id">{{ item.text }}</li>
112
- </ul>
113
- </div>
114
- </template>
115
-
116
- <script setup>
117
- import { ref } from 'vue';
118
-
119
- const title = ref('Hello Vue');
120
- const showButton = ref(true);
121
- const items = ref([{ id: 1, text: 'Item 1' }]);
122
-
123
- function handleClick() {
124
- console.log('Button clicked');
125
- }
126
- </script>
127
- ```
128
-
129
- ```vue
130
- <!-- 转换后 (Lyt SFC) -->
131
- <template>
132
- <div>
133
- <h1>{{ title }}</h1>
134
- <button if="showButton" @click="handleClick">
135
- Click me
136
- </button>
137
- <ul>
138
- <li each="item in items" :key="item.id">{{ item.text }}</li>
139
- </ul>
140
- </div>
141
- </template>
142
-
143
- <script setup>
144
- import { ref } from '@lytjs/compat';
145
-
146
- const title = ref('Hello Vue');
147
- const showButton = ref(true);
148
- const items = ref([{ id: 1, text: 'Item 1' }]);
149
-
150
- function handleClick() {
151
- console.log('Button clicked');
152
- }
153
- </script>
154
- ```
155
-
156
- ## 模板语法转换
157
-
158
- | Vue 3 | Lyt.js |
159
- |------|------|
160
- | `v-if` | `if` |
161
- | `v-else-if` | `else-if` |
162
- | `v-else` | `else` |
163
- | `v-for` | `each` |
164
- | `v-on:click` | `@click` |
165
- | `v-bind:prop` | `:prop` |
166
- | `v-model` | `v-model` |
167
-
168
- ## 程序化使用转换器
169
-
170
- ```javascript
171
- import { convertVueSfcToLyt, VueSfcConverter } from '@lytjs/compat';
172
-
173
- // 便捷函数
174
- const lytCode = convertVueSfcToLyt(vueCode);
175
-
176
- // 类实例方式
177
- const converter = new VueSfcConverter(vueCode);
178
- const parsed = converter.parse(); // 解析 SFC 结构
179
- const converted = converter.convert(); // 执行完整转换
180
- ```
181
-
182
- ## 渐进式迁移策略
183
-
184
- ### 阶段 1:引入兼容层
185
-
186
- ```javascript
187
- // 在 main.js 中
188
- import { createApp } from '@lytjs/compat'; // 替换 'vue'
189
-
190
- const app = createApp(App);
191
- app.mount('#app');
192
- ```
193
-
194
- ### 阶段 2:逐个转换组件
195
-
196
- ```bash
197
- vue-to-lyt src/components/Header.vue
198
- vue-to-lyt src/components/Footer.vue
199
- ```
200
-
201
- ### 阶段 3:完全迁移
202
-
203
- 移除兼容层,直接使用原生 Lyt.js API:
204
-
205
- ```javascript
206
- // 从 '@lytjs/compat' 改为 '@lytjs/core' 和 '@lytjs/reactivity'
207
- import { createApp } from '@lytjs/core';
208
- import { ref, computed } from '@lytjs/reactivity';
209
- ```
210
-
211
- ## 内置组件兼容
212
-
213
- | Vue 3 组件 | Lyt.js 组件 | 兼容状态 |
214
- |----------|------------|---------|
215
- | `KeepAlive` | `KeepAlive` | ✅ 完全兼容 |
216
- | `Teleport` | `Teleport` | ✅ 完全兼容 |
217
- | `Transition` | `Transition` | ✅ 完全兼容 |
218
- | `TransitionGroup` | `TransitionGroup` | ✅ 完全兼容 |
219
- | `Suspense` | `Suspense` | ✅ 完全兼容 |
220
-
221
- ## 示例
222
-
223
- ### 完整迁移示例
224
-
225
- ```javascript
226
- // Vue 3 代码
227
- import { ref, computed, watch, onMounted } from 'vue';
228
-
229
- export default {
230
- props: {
231
- title: String
232
- },
233
- emits: ['update'],
234
- setup(props, { emit }) {
235
- const count = ref(0);
236
- const doubled = computed(() => count.value * 2);
237
-
238
- watch(count, (newVal) => {
239
- emit('update', newVal);
240
- });
241
-
242
- onMounted(() => {
243
- console.log('Mounted');
244
- });
245
-
246
- return { count, doubled };
247
- }
248
- };
249
- ```
250
-
251
- ```javascript
252
- // Lyt.js 兼容层代码(几乎不变)
253
- import { ref, computed, watch, onMounted } from '@lytjs/compat';
254
-
255
- export default {
256
- props: {
257
- title: String
258
- },
259
- emits: ['update'],
260
- setup(props, { emit }) {
261
- const count = ref(0);
262
- const doubled = computed(() => count.value * 2);
263
-
264
- watch(count, (newVal) => {
265
- emit('update', newVal);
266
- });
267
-
268
- onMounted(() => {
269
- console.log('Mounted');
270
- });
271
-
272
- return { count, doubled };
273
- }
274
- };
275
- ```
276
-
277
- ### 批量迁移脚本
278
-
279
- ```bash
280
- # 创建迁移脚本
281
- cat > migrate.sh << 'EOF'
282
- #!/bin/bash
283
-
284
- # 转换所有 .vue 文件
285
- find src -name "*.vue" -exec vue-to-lyt {} \;
286
-
287
- # 更新所有 import 语句
288
- find src -name "*.js" -o -name "*.ts" -o -name "*.vue" | xargs sed -i 's/from "vue"/from "@lytjs\/compat"/g'
289
- find src -name "*.js" -o -name "*.ts" -o -name "*.vue" | xargs sed -i "s/from 'vue'/from '@lytjs\/compat'/g"
290
-
291
- echo "迁移完成!"
292
- EOF
293
-
294
- chmod +x migrate.sh
295
- ./migrate.sh
296
- ```
297
-
298
- ## 性能
299
-
300
- - 完全兼容但零运行时开销
301
- - 转换后的代码直接使用 Lyt.js 核心
302
- - 转换器本身也是零依赖
303
-
304
- ## 兼容性
305
-
306
- - Node.js >= 18.0.0
307
- - Chrome 64+
308
- - Firefox 63+
309
- - Safari 12+
310
- - Edge 79+
311
-
312
- ## License
313
-
314
- MIT
@@ -1,42 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";var k=Object.create;var S=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var M=Object.getPrototypeOf,E=Object.prototype.hasOwnProperty;var T=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of L(e))!E.call(n,r)&&r!==t&&S(n,r,{get:()=>e[r],enumerable:!(s=R(e,r))||s.enumerable});return n};var w=(n,e,t)=>(t=n!=null?k(M(n)):{},T(e||!n||!n.__esModule?S(t,"default",{value:n,enumerable:!0}):t,n));var a=w(require("fs")),p=w(require("path"));var m=class{constructor(e){this.warnings=[];this.content=e}getWarnings(){return[...this.warnings]}addWarning(e,t,s){this.warnings.push({type:e,message:t,suggestion:s})}parse(){let e={template:null,script:null,scriptSetup:null,styles:[],customBlocks:[]},t=this.content.match(/<template[^>]*>([\s\S]*?)<\/template>/);t&&(e.template=t[1].trim());let s=this.content.match(/<script[^>]*setup[^>]*>([\s\S]*?)<\/script>/);if(s&&(e.scriptSetup=s[1].trim()),!e.scriptSetup){let c=this.content.match(/<script(?:\s[^>]*?)?>([\s\S]*?)<\/script>/);c&&(e.script=c[1].trim())}let r=/<style([^>]*)>([\s\S]*?)<\/style>/g,i;for(;(i=r.exec(this.content))!==null;){let c={},u=i[1].match(/(\w+)(?:="([^"]*)")?/g);if(u)for(let l of u){let[g,f]=l.split("=");c[g.trim()]=f?f.replace(/"/g,""):""}e.styles.push({content:i[2].trim(),attrs:c})}let o=/<(template|script|style)([^>]*)>([\s\S]*?)<\/\1>/g,v=this.content.match(/<(\w+)([^>]*)>([\s\S]*?)<\/\1>/g)||[];for(let c of v){let u=c.match(/^<(\w+)/);if(!u)continue;let l=u[1];if(["template","script","style"].includes(l))continue;let g=c.match(new RegExp(`^<${l}[^>]*>([\\s\\S]*?)</${l}>$`));if(!g)continue;let f={},d=c.match(new RegExp(`^<${l}([^>]*)>`));if(d){let h=d[1].match(/(\w+)(?:="([^"]*)")?/g);if(h)for(let W of h){let[x,y]=W.split("=");f[x.trim()]=y?y.replace(/"/g,""):""}}e.customBlocks.push({tag:l,content:g[1].trim(),attrs:f})}return e}convertTemplate(e){let t=e;return t=t.replace(/v-for="([^"]*)"/g,'v-each="$1"'),t=t.replace(/:key=/g,"key="),t=t.replace(/v-if=/g,"if="),t=t.replace(/v-else-if=/g,"else-if="),t=t.replace(/v-else/g,"else"),t=t.replace(/v-show=/g,"show="),t=t.replace(/v-html=/g,"html="),t=t.replace(/v-text=/g,"text="),t=t.replace(/\bv-once\b/g,"once"),t=t.replace(/\bv-pre\b/g,"pre"),t=t.replace(/\bv-cloak\b/g,"cloak"),t=t.replace(/v-slot:/g,"slot:"),t=t.replace(/v-on:/g,"on:"),t=t.replace(/v-model\.(\w+)="/g,'model.$1="'),t=t.replace(/v-model="/g,'model="'),t=t.replace(/v-bind:/g,":"),/v-memo/.test(t)&&(this.addWarning("directive","v-memo \u6307\u4EE4\u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301","\u4F7F\u7528 computed \u5C5E\u6027\u66FF\u4EE3\u624B\u52A8\u7F13\u5B58"),t=t.replace(/\s*v-memo="[^"]*"/g,"")),/v-is/.test(t)&&(this.addWarning("directive","v-is \u52A8\u6001\u7EC4\u4EF6\u8BED\u6CD5\u5728 Lyt.js \u4E2D\u53EF\u80FD\u9700\u8981\u8C03\u6574","\u4F7F\u7528 :is \u5C5E\u6027\u66FF\u4EE3 v-is"),t=t.replace(/v-is=/g,":is=")),t}convertScript(e,t=!1){let s=e;return s=s.replace(/from\s+['"]vue['"]/g,"from '@lytjs/compat'"),s=s.replace(/from\s+['"]vue-router['"]/g,"from '@lytjs/router'"),s=s.replace(/from\s+['"]pinia['"]/g,"from '@lytjs/store'"),s=s.replace(/from\s+['"]vuex['"]/g,"from '@lytjs/store'"),t&&(/defineProps/.test(s)&&this.addWarning("api","defineProps \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362\u4E3A defineComponent({ props: {...} })","\u5728 Lyt.js \u4E2D\u4F7F\u7528 defineComponent \u7684 props \u9009\u9879"),/defineEmits/.test(s)&&this.addWarning("api","defineEmits \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362\u4E3A defineComponent({ emits: {...} })","\u5728 Lyt.js \u4E2D\u4F7F\u7528 defineComponent \u7684 emits \u9009\u9879"),/defineExpose/.test(s)&&this.addWarning("api","defineExpose \u5728 Lyt.js \u4E2D\u4E0D\u9700\u8981","\u5728 Lyt.js \u4E2D setup \u8FD4\u56DE\u7684\u5BF9\u8C61\u81EA\u52A8\u66B4\u9732\u4E3A\u516C\u5171\u5C5E\u6027"),/withDefaults/.test(s)&&this.addWarning("api","withDefaults \u662F\u7F16\u8BD1\u5668\u5B8F\uFF0C\u9700\u8981\u624B\u52A8\u8F6C\u6362","\u5728 defineComponent \u7684 props \u9009\u9879\u4E2D\u4F7F\u7528 default \u5B57\u6BB5"),/useSlots/.test(s)&&this.addWarning("api","useSlots \u5728 Lyt.js \u4E2D\u9700\u8981\u901A\u8FC7 setup \u4E0A\u4E0B\u6587\u8BBF\u95EE","\u4F7F\u7528 setup(props, { slots }) \u8BBF\u95EE\u63D2\u69FD"),/useAttrs/.test(s)&&this.addWarning("api","useAttrs \u5728 Lyt.js \u4E2D\u9700\u8981\u901A\u8FC7 setup \u4E0A\u4E0B\u6587\u8BBF\u95EE","\u4F7F\u7528 setup(props, { attrs }) \u8BBF\u95EE attrs"),s=this.convertScriptSetupToSetup(s)),s}convertScriptSetupToSetup(e){let t=e;return t=t.replace(/const\s+\w+\s*=\s*defineProps\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] defineProps \u5DF2\u79FB\u9664\uFF0C\u8BF7\u5728 defineComponent({ props: {...} }) \u4E2D\u5B9A\u4E49
3
- `),t=t.replace(/const\s+\w+\s*=\s*defineEmits\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] defineEmits \u5DF2\u79FB\u9664\uFF0C\u8BF7\u5728 defineComponent({ emits: [...] }) \u4E2D\u5B9A\u4E49
4
- `),t=t.replace(/defineExpose\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] defineExpose \u5DF2\u79FB\u9664\uFF0Csetup \u8FD4\u56DE\u503C\u81EA\u52A8\u66B4\u9732
5
- `),t=t.replace(/const\s+\w+\s*=\s*withDefaults\s*\([^)]*\)\s*;?\s*\n?/g,`// [Compat] withDefaults \u5DF2\u79FB\u9664\uFF0C\u8BF7\u5728 props \u9009\u9879\u4E2D\u4F7F\u7528 default
6
- `),t}convertStyles(e){let t=[];for(let s of e){let r=Object.entries(s.attrs).map(([i,o])=>o?`${i}="${o}"`:i).join(" ");s.attrs.module!==void 0&&this.addWarning("feature","CSS Modules \u5728 Lyt.js \u4E2D\u4E0D\u652F\u6301","\u4F7F\u7528 scoped \u6837\u5F0F\u66FF\u4EE3"),t.push(`<style${r?" "+r:""}>
7
- ${s.content}
8
- </style>`)}return t.join(`
9
-
10
- `)}convert(){let e=this.parse(),t=[];if(e.template){let s=this.convertTemplate(e.template);t.push(`<template>
11
- ${s}
12
- </template>`)}if(e.scriptSetup){let s=this.convertScript(e.scriptSetup,!0);t.push(`<script setup>
13
- ${s}
14
- </script>`)}else if(e.script){let s=this.convertScript(e.script,!1);t.push(`<script>
15
- ${s}
16
- </script>`)}e.styles.length>0&&t.push(this.convertStyles(e.styles));for(let s of e.customBlocks){let r=Object.entries(s.attrs).map(([i,o])=>o?`${i}="${o}"`:i).join(" ");t.push(`<${s.tag}${r?" "+r:""}>
17
- ${s.content}
18
- </${s.tag}>`)}return t.join(`
19
-
20
- `)}convertWithWarnings(){return this.warnings=[],{code:this.convert(),warnings:this.warnings}}};function C(n){return new m(n).convert()}function P(){let n=process.argv.slice(2),e={input:"",recursive:!1,dryRun:!1,help:!1};for(let t=0;t<n.length;t++){let s=n[t];switch(s){case"-h":case"--help":e.help=!0;break;case"-r":case"--recursive":e.recursive=!0;break;case"-d":case"--dry-run":e.dryRun=!0;break;case"-o":case"--output":e.output=n[++t];break;default:e.input||(e.input=s);break}}return e}function b(){console.log(`
21
- vue-to-lyt - \u5C06 Vue \u9879\u76EE\u8F6C\u6362\u4E3A Lyt.js \u9879\u76EE
22
-
23
- \u7528\u6CD5:
24
- vue-to-lyt <input> [options]
25
-
26
- \u9009\u9879:
27
- -h, --help \u663E\u793A\u5E2E\u52A9\u4FE1\u606F
28
- -o, --output \u6307\u5B9A\u8F93\u51FA\u76EE\u5F55\uFF08\u53EF\u9009\uFF09
29
- -r, --recursive \u9012\u5F52\u5904\u7406\u76EE\u5F55
30
- -d, --dry-run \u9884\u89C8\u8F6C\u6362\uFF0C\u4E0D\u5B9E\u9645\u5199\u5165\u6587\u4EF6
31
-
32
- \u793A\u4F8B:
33
- # \u8F6C\u6362\u5355\u4E2A\u6587\u4EF6
34
- vue-to-lyt ./src/MyComponent.vue
35
-
36
- # \u8F6C\u6362\u6574\u4E2A\u76EE\u5F55
37
- vue-to-lyt ./src --recursive
38
-
39
- # \u8F6C\u6362\u5230\u6307\u5B9A\u8F93\u51FA\u76EE\u5F55
40
- vue-to-lyt ./src --recursive --output ./lyt-src
41
- `)}function $(n,e){try{let t=a.readFileSync(n,"utf-8"),s=C(t),r=e||n.replace(/\.vue$/,".lyt");return console.log(`[\u8F6C\u6362] ${n} -> ${r}`),console.log(t!==s?"[\u53D8\u66F4] \u6587\u4EF6\u5185\u5BB9\u5DF2\u8F6C\u6362":"[\u8DF3\u8FC7] \u6587\u4EF6\u5185\u5BB9\u65E0\u9700\u8F6C\u6362"),!0}catch(t){return console.error(`[\u9519\u8BEF] \u5904\u7406\u6587\u4EF6 ${n} \u65F6\u51FA\u9519:`,t),!1}}function j(n,e){let t=a.readdirSync(n);for(let s of t){let r=p.join(n,s);if(a.statSync(r).isDirectory()){if(s==="node_modules"||s===".git")continue;let o=e?p.join(e,s):void 0;j(r,o)}else if(s.endsWith(".vue")){let o;if(e){let v=p.relative(n,r);o=p.join(e,v.replace(/\.vue$/,".lyt"))}$(r,o)}}}function B(){let n=P();n.help&&(b(),process.exit(0)),n.input||(console.error("\u9519\u8BEF: \u8BF7\u6307\u5B9A\u8F93\u5165\u6587\u4EF6\u6216\u76EE\u5F55"),b(),process.exit(1));let e=p.resolve(n.input);a.existsSync(e)||(console.error(`\u9519\u8BEF: \u8DEF\u5F84\u4E0D\u5B58\u5728: ${e}`),process.exit(1));let t=a.statSync(e);t.isDirectory()?(n.recursive||(console.error("\u9519\u8BEF: \u8F93\u5165\u662F\u76EE\u5F55\uFF0C\u8BF7\u4F7F\u7528 --recursive \u9009\u9879"),process.exit(1)),j(e,n.output)):t.isFile()&&$(e,n.output),console.log(`
42
- \u8F6C\u6362\u5B8C\u6210!`)}B();
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- require("./vue-to-lyt.cjs")