vite-check-multiple-dom 0.1.3-beta.1 → 0.1.3-beta.2

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/client.cjs CHANGED
@@ -1,186 +1 @@
1
- const require_i18n = require('./i18n-Ru0ynOFx.cjs');
2
-
3
- //#region src/client.ts
4
- /**
5
- * Vue Transition 警告关键字
6
- * 用于识别 Vue 运行时发出的 Transition 多根节点警告
7
- */
8
- const VUE_TRANSITION_WARN = "Component inside <Transition> renders non-element root node that cannot be animated.";
9
- /**
10
- * 从 Vue 警告信息中提取组件名称
11
- * 示例: "at <Index onVnodeUnmounted=... key="/test" ... >"
12
- */
13
- function extractComponentName(text) {
14
- return text.match(/at <([^\s>]+)/)?.[1];
15
- }
16
- /**
17
- * 从 Vue 警告信息中提取路由 key
18
- * 示例: key="/test"
19
- */
20
- function extractRouteKey(text) {
21
- return text.match(/key=\"([^\"]+)\"/)?.[1];
22
- }
23
- /**
24
- * 获取组件实例可能对应的文件路径
25
- */
26
- function guessViewFileFromInstance(instance) {
27
- if (!instance) return void 0;
28
- return instance.$options["__file"];
29
- }
30
- /**
31
- * 获取组件实例可能对应的文件路径
32
- */
33
- function getViewUrlFromInstance(instance) {
34
- if (!instance) return void 0;
35
- return instance.$el?.baseURI;
36
- }
37
- /**
38
- * 检查插件是否已经安装
39
- */
40
- function alreadyInstalled() {
41
- return Boolean(globalThis["__VITE_PLUGIN_VUE_TRANSITION_ROOT_VALIDATOR_INSTALLED__"]);
42
- }
43
- /**
44
- * 标记插件已安装
45
- */
46
- function markInstalled() {
47
- globalThis["__VITE_PLUGIN_VUE_TRANSITION_ROOT_VALIDATOR_INSTALLED__"] = true;
48
- }
49
- const pendingPayloads = /* @__PURE__ */ new Map();
50
- let listenersBound = false;
51
- let retryTimer = null;
52
- let retryDelayMs = 200;
53
- function getHot() {
54
- return {}.hot;
55
- }
56
- function trySendNow(payload) {
57
- const hot = getHot();
58
- if (!hot?.send) return false;
59
- try {
60
- hot.send("vite-plugin-vue-transition-root-validator:vue-warn", payload);
61
- return true;
62
- } catch {
63
- return false;
64
- }
65
- }
66
- function scheduleRetry() {
67
- if (retryTimer !== null) return;
68
- retryTimer = globalThis.setTimeout(() => {
69
- retryTimer = null;
70
- flushPendingPayloads();
71
- if (pendingPayloads.size) {
72
- retryDelayMs = Math.min(retryDelayMs * 2, 2e3);
73
- scheduleRetry();
74
- }
75
- }, retryDelayMs);
76
- }
77
- function flushPendingPayloads() {
78
- if (!pendingPayloads.size) return;
79
- for (const p of pendingPayloads.values()) trySendNow(p);
80
- }
81
- function bindHmrListenersOnce() {
82
- if (listenersBound) return;
83
- listenersBound = true;
84
- const hot = getHot();
85
- if (!hot?.on) return;
86
- hot.on("vite:ws:connect", () => {
87
- retryDelayMs = 200;
88
- if (retryTimer !== null) {
89
- clearTimeout(retryTimer);
90
- retryTimer = null;
91
- }
92
- flushPendingPayloads();
93
- });
94
- hot.on("vite-plugin-vue-transition-root-validator:ack", (data) => {
95
- const key = data?.key;
96
- if (!key) return;
97
- pendingPayloads.delete(key);
98
- if (!pendingPayloads.size) {
99
- retryDelayMs = 200;
100
- if (retryTimer !== null) {
101
- clearTimeout(retryTimer);
102
- retryTimer = null;
103
- }
104
- }
105
- });
106
- }
107
- function send(payload) {
108
- if (!getHot()?.send) return;
109
- bindHmrListenersOnce();
110
- pendingPayloads.set(payload.key, payload);
111
- trySendNow(payload);
112
- scheduleRetry();
113
- }
114
- let originalWarnHandler = null;
115
- function resendLog(msg, instance, trace) {
116
- if (originalWarnHandler) originalWarnHandler(msg, instance, trace);
117
- }
118
- /**
119
- * 设置 Vue Root Validator
120
- *
121
- * 在 Vue 应用上注册 warnHandler 来捕获 Transition 多根节点警告
122
- *
123
- * @param app - Vue 应用实例
124
- * @param options - 配置选项
125
- *
126
- * @example
127
- * ```ts
128
- * import { createApp } from 'vue';
129
- * import { setupVueRootValidator } from 'virtual:vue-transition-root-validator';
130
- * import App from './App.vue';
131
- *
132
- * const app = createApp(App);
133
- *
134
- * // 在挂载前设置验证器
135
- * setupVueRootValidator(app, { lang: 'zh' });
136
- *
137
- * app.mount('#app');
138
- * ```
139
- */
140
- function setupVueRootValidator(app, options = {}) {
141
- if (alreadyInstalled()) return;
142
- markInstalled();
143
- const lang = options.lang ?? "en";
144
- const disableAfterFirstError = options.disableAfterFirstError ?? false;
145
- bindHmrListenersOnce();
146
- originalWarnHandler = app.config.warnHandler;
147
- let lastSentAt = 0;
148
- let lastSentKey = "";
149
- let errorSent = false;
150
- /**
151
- * 自定义 Vue 警告处理器
152
- *
153
- * @param msg - 警告消息
154
- * @param instance - 组件实例
155
- * @param trace - 组件追踪栈
156
- */
157
- app.config.warnHandler = (msg, instance, trace) => {
158
- resendLog(msg, instance, trace);
159
- if (disableAfterFirstError && errorSent) return;
160
- if (!msg.includes(VUE_TRANSITION_WARN)) return;
161
- const now = Date.now();
162
- const key = (msg + trace).slice(0, 400);
163
- if (now - lastSentAt > 500 || key !== lastSentKey) {
164
- lastSentAt = now;
165
- lastSentKey = key;
166
- const routeKey = extractRouteKey(trace);
167
- const component = extractComponentName(trace);
168
- const file = guessViewFileFromInstance(instance);
169
- const message = require_i18n.formatTransitionRootMessage(lang, {
170
- url: getViewUrlFromInstance(instance),
171
- file,
172
- routeKey,
173
- component
174
- });
175
- send({
176
- key: message.slice(0, 800),
177
- message,
178
- lang
179
- });
180
- errorSent = true;
181
- }
182
- };
183
- }
184
-
185
- //#endregion
186
- exports.setupVueRootValidator = setupVueRootValidator;
1
+ const _0x438753=_0x3aa2;(function(_0x367291,_0x308d80){const _0x432464=_0x3aa2,_0x3bd07c=_0x367291();while(!![]){try{const _0x252b1b=parseInt(_0x432464(0x9f))/0x1*(-parseInt(_0x432464(0xc1))/0x2)+-parseInt(_0x432464(0xb5))/0x3+parseInt(_0x432464(0xc3))/0x4+parseInt(_0x432464(0xcd))/0x5*(parseInt(_0x432464(0xa4))/0x6)+parseInt(_0x432464(0xd4))/0x7*(parseInt(_0x432464(0xa9))/0x8)+-parseInt(_0x432464(0xc2))/0x9+parseInt(_0x432464(0xb1))/0xa*(parseInt(_0x432464(0xd5))/0xb);if(_0x252b1b===_0x308d80)break;else _0x3bd07c['push'](_0x3bd07c['shift']());}catch(_0x23dc28){_0x3bd07c['push'](_0x3bd07c['shift']());}}}(_0x30ac,0x51c66));const require_i18n=require(_0x438753(0xb8)),VUE_TRANSITION_WARN=_0x438753(0xd0);function extractComponentName(_0x9c62ff){const _0x3aa1b1=_0x438753;return _0x9c62ff[_0x3aa1b1(0xc5)](/at <([^\s>]+)/)?.[0x1];}function extractRouteKey(_0x105858){const _0x1c5ed7=_0x438753;return _0x105858[_0x1c5ed7(0xc5)](/key=\"([^\"]+)\"/)?.[0x1];}function guessViewFileFromInstance(_0x598cd5){const _0x5be38e=_0x438753,_0x23b6b7={};_0x23b6b7['OLxqy']=_0x5be38e(0xbc);const _0x2211b6=_0x23b6b7;if(!_0x598cd5)return void 0x0;return _0x598cd5[_0x5be38e(0xa6)][_0x2211b6[_0x5be38e(0xa7)]];}function _0x30ac(){const _0x14a59a=['uuAKH','OxCUg','__file','__VITE_PLUGIN_VUE_TRANSITION_ROOT_VALIDATOR_INSTALLED__','disableAfterFirstError','aIGcE','Iskkf','6IQUwSZ','3059055GaxwIY','833988ivnVPp','baseURI','match','TNrNn','LFcnZ','key','OQuXr','min','RqFIY','hot','568850tebOXV','bAtmw','setTimeout','Component\x20inside\x20<Transition>\x20renders\x20non-element\x20root\x20node\x20that\x20cannot\x20be\x20animated.','sISea','uSAcL','size','2357950MhHYur','14399KrPdLz','yebax','PELoQ','includes','41376ggXUCC','xrgqS','vite-plugin-vue-transition-root-validator:ack','$el','Hcnnc','18FDdegn','IctyV','$options','OLxqy','slice','8QeNVAw','OWWTU','send','warnHandler','config','biCLC','now','formatTransitionRootMessage','4090yufdzx','setupVueRootValidator','iLliO','set','1869195ZSByZF','vite-plugin-vue-transition-root-validator:vue-warn','delete','./i18n-Ru0ynOFx.cjs','ZEAKU'];_0x30ac=function(){return _0x14a59a;};return _0x30ac();}function getViewUrlFromInstance(_0x3ca81e){const _0x5251f2=_0x438753;if(!_0x3ca81e)return void 0x0;return _0x3ca81e[_0x5251f2(0xa2)]?.[_0x5251f2(0xc4)];}function alreadyInstalled(){const _0x18988f=_0x438753,_0x278e5d={'IctyV':function(_0x135afe,_0x1f2683){return _0x135afe(_0x1f2683);},'PELoQ':'__VITE_PLUGIN_VUE_TRANSITION_ROOT_VALIDATOR_INSTALLED__'};return _0x278e5d[_0x18988f(0xa5)](Boolean,globalThis[_0x278e5d[_0x18988f(0xd7)]]);}function markInstalled(){const _0x33ae07=_0x438753,_0x360677={};_0x360677[_0x33ae07(0xb9)]=_0x33ae07(0xbd);const _0x187bb3=_0x360677;globalThis[_0x187bb3['ZEAKU']]=!![];}const pendingPayloads=new Map();let listenersBound=![],retryTimer=null,retryDelayMs=0xc8;function getHot(){const _0x3bab91=_0x438753;return{}[_0x3bab91(0xcc)];}function trySendNow(_0x44866f){const _0x13a4b6=_0x438753,_0x48beff={};_0x48beff[_0x13a4b6(0xc7)]=_0x13a4b6(0xb6);const _0x57b336=_0x48beff,_0x29fc68=getHot();if(!_0x29fc68?.['send'])return![];try{return _0x29fc68[_0x13a4b6(0xab)](_0x57b336['LFcnZ'],_0x44866f),!![];}catch{return![];}}function scheduleRetry(){const _0x36ae05=_0x438753,_0xc51d3d={'xrgqS':function(_0x571273){return _0x571273();},'OQuXr':function(_0x32b914,_0xe6da76){return _0x32b914*_0xe6da76;},'Iskkf':function(_0x4efaca){return _0x4efaca();},'JollQ':function(_0x52b7dd,_0x1427ec){return _0x52b7dd!==_0x1427ec;}};if(_0xc51d3d['JollQ'](retryTimer,null))return;retryTimer=globalThis[_0x36ae05(0xcf)](()=>{const _0x4cf50f=_0x36ae05;retryTimer=null,_0xc51d3d[_0x4cf50f(0xa0)](flushPendingPayloads),pendingPayloads[_0x4cf50f(0xd3)]&&(retryDelayMs=Math[_0x4cf50f(0xca)](_0xc51d3d[_0x4cf50f(0xc9)](retryDelayMs,0x2),0x7d0),_0xc51d3d[_0x4cf50f(0xc0)](scheduleRetry));},retryDelayMs);}function flushPendingPayloads(){const _0x27a469=_0x438753,_0x2fd0ba={'Hcnnc':function(_0x2b2afb,_0x29bf8b){return _0x2b2afb(_0x29bf8b);}};if(!pendingPayloads['size'])return;for(const _0x2c6b97 of pendingPayloads['values']())_0x2fd0ba[_0x27a469(0xa3)](trySendNow,_0x2c6b97);}function bindHmrListenersOnce(){const _0x38f793=_0x438753,_0x2e5073={'RqFIY':function(_0xd84a98,_0x31e8d1){return _0xd84a98!==_0x31e8d1;},'UDvey':function(_0x29cff7,_0x42fa4f){return _0x29cff7(_0x42fa4f);},'iLliO':function(_0xa43b55){return _0xa43b55();},'RagSK':function(_0x2ccb6e,_0x561bf7){return _0x2ccb6e(_0x561bf7);},'bAtmw':'vite:ws:connect','OxCUg':_0x38f793(0xa1)};if(listenersBound)return;listenersBound=!![];const _0x27165e=_0x2e5073[_0x38f793(0xb3)](getHot);if(!_0x27165e?.['on'])return;_0x27165e['on'](_0x2e5073[_0x38f793(0xce)],()=>{const _0x509b35=_0x38f793;retryDelayMs=0xc8,_0x2e5073[_0x509b35(0xcb)](retryTimer,null)&&(_0x2e5073['UDvey'](clearTimeout,retryTimer),retryTimer=null),_0x2e5073['iLliO'](flushPendingPayloads);}),_0x27165e['on'](_0x2e5073[_0x38f793(0xbb)],_0x171656=>{const _0x49b76c=_0x38f793,_0x5f412e=_0x171656?.[_0x49b76c(0xc8)];if(!_0x5f412e)return;pendingPayloads[_0x49b76c(0xb7)](_0x5f412e),!pendingPayloads[_0x49b76c(0xd3)]&&(retryDelayMs=0xc8,retryTimer!==null&&(_0x2e5073['RagSK'](clearTimeout,retryTimer),retryTimer=null));});}function send(_0x26d056){const _0x391a29=_0x438753,_0x576205={'OWWTU':function(_0x23569a){return _0x23569a();},'uuAKH':function(_0x4498a7,_0x197a75){return _0x4498a7(_0x197a75);}};if(!_0x576205[_0x391a29(0xaa)](getHot)?.[_0x391a29(0xab)])return;_0x576205[_0x391a29(0xaa)](bindHmrListenersOnce),pendingPayloads[_0x391a29(0xb4)](_0x26d056['key'],_0x26d056),_0x576205[_0x391a29(0xba)](trySendNow,_0x26d056),scheduleRetry();}let originalWarnHandler=null;function resendLog(_0x495c9a,_0x2200e4,_0x40d8a3){if(originalWarnHandler)originalWarnHandler(_0x495c9a,_0x2200e4,_0x40d8a3);}function _0x3aa2(_0x5080a8,_0x4d11a8){_0x5080a8=_0x5080a8-0x9f;const _0x30acc4=_0x30ac();let _0x3aa2e6=_0x30acc4[_0x5080a8];return _0x3aa2e6;}function setupVueRootValidator(_0x3a3b63,_0x5a270a={}){const _0x3288ef=_0x438753,_0x1b1293={'JDMGh':function(_0x41d3ad,_0x413acc,_0x16bd3e,_0x1f049){return _0x41d3ad(_0x413acc,_0x16bd3e,_0x1f049);},'biCLC':function(_0x48177a,_0x11ae23){return _0x48177a&&_0x11ae23;},'RqUpy':function(_0x427c10,_0x5ad311){return _0x427c10+_0x5ad311;},'TNrNn':function(_0x3b7589,_0x305068){return _0x3b7589>_0x305068;},'MweLu':function(_0x576eee,_0x353b97){return _0x576eee-_0x353b97;},'yebax':function(_0x10c34f,_0x31ee82){return _0x10c34f!==_0x31ee82;},'uSAcL':function(_0x4cc35d,_0x43ffd8){return _0x4cc35d(_0x43ffd8);},'sISea':function(_0x4388ac,_0x46efa8){return _0x4388ac(_0x46efa8);},'aIGcE':function(_0x4d393a){return _0x4d393a();}};if(_0x1b1293[_0x3288ef(0xbf)](alreadyInstalled))return;_0x1b1293[_0x3288ef(0xbf)](markInstalled);const _0x276c3a=_0x5a270a['lang']??'en',_0x36a686=_0x5a270a[_0x3288ef(0xbe)]??![];bindHmrListenersOnce(),originalWarnHandler=_0x3a3b63[_0x3288ef(0xad)][_0x3288ef(0xac)];let _0x5c7213=0x0,_0x5c533c='',_0x3f38d4=![];_0x3a3b63[_0x3288ef(0xad)][_0x3288ef(0xac)]=(_0x1c13aa,_0x52d56b,_0x2e3b43)=>{const _0x4a8c57=_0x3288ef;_0x1b1293['JDMGh'](resendLog,_0x1c13aa,_0x52d56b,_0x2e3b43);if(_0x1b1293[_0x4a8c57(0xae)](_0x36a686,_0x3f38d4))return;if(!_0x1c13aa[_0x4a8c57(0xd8)](VUE_TRANSITION_WARN))return;const _0x4e297b=Date[_0x4a8c57(0xaf)](),_0x648fa5=_0x1b1293['RqUpy'](_0x1c13aa,_0x2e3b43)[_0x4a8c57(0xa8)](0x0,0x190);if(_0x1b1293[_0x4a8c57(0xc6)](_0x1b1293['MweLu'](_0x4e297b,_0x5c7213),0x1f4)||_0x1b1293[_0x4a8c57(0xd6)](_0x648fa5,_0x5c533c)){_0x5c7213=_0x4e297b,_0x5c533c=_0x648fa5;const _0x3ee678=_0x1b1293[_0x4a8c57(0xd2)](extractRouteKey,_0x2e3b43),_0x1dd72c=extractComponentName(_0x2e3b43),_0x53e536=_0x1b1293[_0x4a8c57(0xd1)](guessViewFileFromInstance,_0x52d56b),_0x1a7caf=require_i18n[_0x4a8c57(0xb0)](_0x276c3a,{'url':getViewUrlFromInstance(_0x52d56b),'file':_0x53e536,'routeKey':_0x3ee678,'component':_0x1dd72c});send({'key':_0x1a7caf['slice'](0x0,0x320),'message':_0x1a7caf,'lang':_0x276c3a}),_0x3f38d4=!![];}};}exports[_0x438753(0xb2)]=setupVueRootValidator;
package/dist/client.js CHANGED
@@ -1,187 +1 @@
1
- import { t as formatTransitionRootMessage } from "./i18n-BulTAahL.js";
2
-
3
- //#region src/client.ts
4
- /**
5
- * Vue Transition 警告关键字
6
- * 用于识别 Vue 运行时发出的 Transition 多根节点警告
7
- */
8
- const VUE_TRANSITION_WARN = "Component inside <Transition> renders non-element root node that cannot be animated.";
9
- /**
10
- * 从 Vue 警告信息中提取组件名称
11
- * 示例: "at <Index onVnodeUnmounted=... key="/test" ... >"
12
- */
13
- function extractComponentName(text) {
14
- return text.match(/at <([^\s>]+)/)?.[1];
15
- }
16
- /**
17
- * 从 Vue 警告信息中提取路由 key
18
- * 示例: key="/test"
19
- */
20
- function extractRouteKey(text) {
21
- return text.match(/key=\"([^\"]+)\"/)?.[1];
22
- }
23
- /**
24
- * 获取组件实例可能对应的文件路径
25
- */
26
- function guessViewFileFromInstance(instance) {
27
- if (!instance) return void 0;
28
- return instance.$options["__file"];
29
- }
30
- /**
31
- * 获取组件实例可能对应的文件路径
32
- */
33
- function getViewUrlFromInstance(instance) {
34
- if (!instance) return void 0;
35
- return instance.$el?.baseURI;
36
- }
37
- /**
38
- * 检查插件是否已经安装
39
- */
40
- function alreadyInstalled() {
41
- return Boolean(globalThis["__VITE_PLUGIN_VUE_TRANSITION_ROOT_VALIDATOR_INSTALLED__"]);
42
- }
43
- /**
44
- * 标记插件已安装
45
- */
46
- function markInstalled() {
47
- globalThis["__VITE_PLUGIN_VUE_TRANSITION_ROOT_VALIDATOR_INSTALLED__"] = true;
48
- }
49
- const pendingPayloads = /* @__PURE__ */ new Map();
50
- let listenersBound = false;
51
- let retryTimer = null;
52
- let retryDelayMs = 200;
53
- function getHot() {
54
- return import.meta.hot;
55
- }
56
- function trySendNow(payload) {
57
- const hot = getHot();
58
- if (!hot?.send) return false;
59
- try {
60
- hot.send("vite-plugin-vue-transition-root-validator:vue-warn", payload);
61
- return true;
62
- } catch {
63
- return false;
64
- }
65
- }
66
- function scheduleRetry() {
67
- if (retryTimer !== null) return;
68
- retryTimer = globalThis.setTimeout(() => {
69
- retryTimer = null;
70
- flushPendingPayloads();
71
- if (pendingPayloads.size) {
72
- retryDelayMs = Math.min(retryDelayMs * 2, 2e3);
73
- scheduleRetry();
74
- }
75
- }, retryDelayMs);
76
- }
77
- function flushPendingPayloads() {
78
- if (!pendingPayloads.size) return;
79
- for (const p of pendingPayloads.values()) trySendNow(p);
80
- }
81
- function bindHmrListenersOnce() {
82
- if (listenersBound) return;
83
- listenersBound = true;
84
- const hot = getHot();
85
- if (!hot?.on) return;
86
- hot.on("vite:ws:connect", () => {
87
- retryDelayMs = 200;
88
- if (retryTimer !== null) {
89
- clearTimeout(retryTimer);
90
- retryTimer = null;
91
- }
92
- flushPendingPayloads();
93
- });
94
- hot.on("vite-plugin-vue-transition-root-validator:ack", (data) => {
95
- const key = data?.key;
96
- if (!key) return;
97
- pendingPayloads.delete(key);
98
- if (!pendingPayloads.size) {
99
- retryDelayMs = 200;
100
- if (retryTimer !== null) {
101
- clearTimeout(retryTimer);
102
- retryTimer = null;
103
- }
104
- }
105
- });
106
- }
107
- function send(payload) {
108
- if (!getHot()?.send) return;
109
- bindHmrListenersOnce();
110
- pendingPayloads.set(payload.key, payload);
111
- trySendNow(payload);
112
- scheduleRetry();
113
- }
114
- let originalWarnHandler = null;
115
- function resendLog(msg, instance, trace) {
116
- if (originalWarnHandler) originalWarnHandler(msg, instance, trace);
117
- }
118
- /**
119
- * 设置 Vue Root Validator
120
- *
121
- * 在 Vue 应用上注册 warnHandler 来捕获 Transition 多根节点警告
122
- *
123
- * @param app - Vue 应用实例
124
- * @param options - 配置选项
125
- *
126
- * @example
127
- * ```ts
128
- * import { createApp } from 'vue';
129
- * import { setupVueRootValidator } from 'virtual:vue-transition-root-validator';
130
- * import App from './App.vue';
131
- *
132
- * const app = createApp(App);
133
- *
134
- * // 在挂载前设置验证器
135
- * setupVueRootValidator(app, { lang: 'zh' });
136
- *
137
- * app.mount('#app');
138
- * ```
139
- */
140
- function setupVueRootValidator(app, options = {}) {
141
- if (alreadyInstalled()) return;
142
- markInstalled();
143
- const lang = options.lang ?? "en";
144
- const disableAfterFirstError = options.disableAfterFirstError ?? false;
145
- bindHmrListenersOnce();
146
- originalWarnHandler = app.config.warnHandler;
147
- let lastSentAt = 0;
148
- let lastSentKey = "";
149
- let errorSent = false;
150
- /**
151
- * 自定义 Vue 警告处理器
152
- *
153
- * @param msg - 警告消息
154
- * @param instance - 组件实例
155
- * @param trace - 组件追踪栈
156
- */
157
- app.config.warnHandler = (msg, instance, trace) => {
158
- resendLog(msg, instance, trace);
159
- if (disableAfterFirstError && errorSent) return;
160
- if (!msg.includes(VUE_TRANSITION_WARN)) return;
161
- const now = Date.now();
162
- const key = (msg + trace).slice(0, 400);
163
- if (now - lastSentAt > 500 || key !== lastSentKey) {
164
- lastSentAt = now;
165
- lastSentKey = key;
166
- const routeKey = extractRouteKey(trace);
167
- const component = extractComponentName(trace);
168
- const file = guessViewFileFromInstance(instance);
169
- const message = formatTransitionRootMessage(lang, {
170
- url: getViewUrlFromInstance(instance),
171
- file,
172
- routeKey,
173
- component
174
- });
175
- send({
176
- key: message.slice(0, 800),
177
- message,
178
- lang
179
- });
180
- errorSent = true;
181
- }
182
- };
183
- }
184
-
185
- //#endregion
186
- export { setupVueRootValidator };
187
- //# sourceMappingURL=client.js.map
1
+ const _0x52dfa2=_0x2309;(function(_0x5b9fd9,_0x222f55){const _0x97bb6e=_0x2309,_0x2861e2=_0x5b9fd9();while(!![]){try{const _0x1867ae=parseInt(_0x97bb6e(0x1f0))/0x1+-parseInt(_0x97bb6e(0x1dc))/0x2+-parseInt(_0x97bb6e(0x1e2))/0x3*(parseInt(_0x97bb6e(0x201))/0x4)+parseInt(_0x97bb6e(0x204))/0x5*(-parseInt(_0x97bb6e(0x1fc))/0x6)+-parseInt(_0x97bb6e(0x200))/0x7+parseInt(_0x97bb6e(0x1f7))/0x8+parseInt(_0x97bb6e(0x1ff))/0x9;if(_0x1867ae===_0x222f55)break;else _0x2861e2['push'](_0x2861e2['shift']());}catch(_0x1eb2a8){_0x2861e2['push'](_0x2861e2['shift']());}}}(_0x4996,0xa1f51));import{t as _0x34bb20}from'./i18n-BulTAahL.js';const VUE_TRANSITION_WARN=_0x52dfa2(0x208);function extractComponentName(_0x2f13fb){const _0x97b6ea=_0x52dfa2;return _0x2f13fb[_0x97b6ea(0x1f1)](/at <([^\s>]+)/)?.[0x1];}function extractRouteKey(_0x902d34){const _0x3f7fe3=_0x52dfa2;return _0x902d34[_0x3f7fe3(0x1f1)](/key=\"([^\"]+)\"/)?.[0x1];}function guessViewFileFromInstance(_0x3dc1ef){const _0x34a004=_0x52dfa2,_0x4027f2={};_0x4027f2[_0x34a004(0x20a)]=_0x34a004(0x1eb);const _0x1fb744=_0x4027f2;if(!_0x3dc1ef)return void 0x0;return _0x3dc1ef[_0x34a004(0x210)][_0x1fb744['UYIOY']];}function _0x4996(){const _0x4b8a6a=['zmxXT','zzzzo','iCmxH','OUGRV','4|2|1|3|0','593584BWzqje','vite:ws:connect','__VITE_PLUGIN_VUE_TRANSITION_ROOT_VALIDATOR_INSTALLED__','lang','send','2094tMZiLS','delete','OaxYY','21544722FhGOtn','6500277nopBgL','3512148lCTwBe','CebEe','bMSmS','7655uVSsDf','qqhfF','ZYinO','yzqnJ','Component\x20inside\x20<Transition>\x20renders\x20non-element\x20root\x20node\x20that\x20cannot\x20be\x20animated.','disableAfterFirstError','UYIOY','RBsFI','now','size','kvPMF','bUlbj','$options','BvtOV','$el','HUetW','config','includes','1216148fvpuzo','CRxiI','slice','MHMBW','PEeil','split','3XMbtlv','values','SMZWO','FgigM','warnHandler','Riilz','setTimeout','cxppY','PuwrR','__file','key','min','set','GDPJb','1144362eSJmfK','match'];_0x4996=function(){return _0x4b8a6a;};return _0x4996();}function getViewUrlFromInstance(_0x2d05cd){const _0x5c99a0=_0x52dfa2;if(!_0x2d05cd)return void 0x0;return _0x2d05cd[_0x5c99a0(0x212)]?.['baseURI'];}function alreadyInstalled(){const _0x38a3b2=_0x52dfa2,_0x2e335d={'WpZxy':function(_0x5eeced,_0x45fce4){return _0x5eeced(_0x45fce4);},'CebEe':'__VITE_PLUGIN_VUE_TRANSITION_ROOT_VALIDATOR_INSTALLED__'};return _0x2e335d['WpZxy'](Boolean,globalThis[_0x2e335d[_0x38a3b2(0x202)]]);}function markInstalled(){const _0x136139=_0x52dfa2,_0x349039={};_0x349039[_0x136139(0x1f5)]=_0x136139(0x1f9);const _0x276455=_0x349039;globalThis[_0x276455[_0x136139(0x1f5)]]=!![];}const pendingPayloads=new Map();let listenersBound=![],retryTimer=null,retryDelayMs=0xc8;function getHot(){return import.meta.hot;}function trySendNow(_0x4f2f2e){const _0x27e840=_0x52dfa2,_0x2acbd8={};_0x2acbd8[_0x27e840(0x1e9)]='vite-plugin-vue-transition-root-validator:vue-warn';const _0x5dcf55=_0x2acbd8,_0x3ef74f=getHot();if(!_0x3ef74f?.[_0x27e840(0x1fb)])return![];try{return _0x3ef74f[_0x27e840(0x1fb)](_0x5dcf55[_0x27e840(0x1e9)],_0x4f2f2e),!![];}catch{return![];}}function scheduleRetry(){const _0x204d1c=_0x52dfa2,_0x3f3682={'GDPJb':function(_0x22c5cb){return _0x22c5cb();},'Riilz':function(_0x59ade5){return _0x59ade5();},'zzzzo':function(_0x5898ab,_0x44ba4b){return _0x5898ab!==_0x44ba4b;}};if(_0x3f3682[_0x204d1c(0x1f3)](retryTimer,null))return;retryTimer=globalThis[_0x204d1c(0x1e8)](()=>{const _0x22d801=_0x204d1c;retryTimer=null,_0x3f3682[_0x22d801(0x1ef)](flushPendingPayloads),pendingPayloads[_0x22d801(0x20d)]&&(retryDelayMs=Math[_0x22d801(0x1ed)](retryDelayMs*0x2,0x7d0),_0x3f3682[_0x22d801(0x1e7)](scheduleRetry));},retryDelayMs);}function flushPendingPayloads(){const _0x2946b5=_0x52dfa2,_0x283124={'RBsFI':function(_0x405c6c,_0x2d8cc4){return _0x405c6c(_0x2d8cc4);}};if(!pendingPayloads[_0x2946b5(0x20d)])return;for(const _0x5d1410 of pendingPayloads[_0x2946b5(0x1e3)]())_0x283124[_0x2946b5(0x20b)](trySendNow,_0x5d1410);}function bindHmrListenersOnce(){const _0x4086a2=_0x52dfa2,_0x24bd83={'iCmxH':function(_0x327fd1,_0x4543ba){return _0x327fd1!==_0x4543ba;},'CRxiI':function(_0x2f5d77,_0x319890){return _0x2f5d77(_0x319890);},'PEeil':function(_0x40e1e2){return _0x40e1e2();},'zEPTa':function(_0x394bc5,_0x180875){return _0x394bc5(_0x180875);},'zmxXT':_0x4086a2(0x1f8),'xKdpQ':'vite-plugin-vue-transition-root-validator:ack'};if(listenersBound)return;listenersBound=!![];const _0x1dc15b=_0x24bd83[_0x4086a2(0x1e0)](getHot);if(!_0x1dc15b?.['on'])return;_0x1dc15b['on'](_0x24bd83[_0x4086a2(0x1f2)],()=>{const _0x4beda0=_0x4086a2;retryDelayMs=0xc8,_0x24bd83['iCmxH'](retryTimer,null)&&(_0x24bd83[_0x4beda0(0x1dd)](clearTimeout,retryTimer),retryTimer=null),_0x24bd83[_0x4beda0(0x1e0)](flushPendingPayloads);}),_0x1dc15b['on'](_0x24bd83['xKdpQ'],_0x48b9de=>{const _0x4e6477=_0x4086a2,_0x20b204=_0x48b9de?.[_0x4e6477(0x1ec)];if(!_0x20b204)return;pendingPayloads[_0x4e6477(0x1fd)](_0x20b204),!pendingPayloads[_0x4e6477(0x20d)]&&(retryDelayMs=0xc8,_0x24bd83[_0x4e6477(0x1f4)](retryTimer,null)&&(_0x24bd83['zEPTa'](clearTimeout,retryTimer),retryTimer=null));});}function send(_0x2e1a13){const _0x5c7026=_0x52dfa2,_0xa9e940={'SMZWO':function(_0xd3f2e9){return _0xd3f2e9();},'HUetW':function(_0x5b53c4,_0x4b7daa){return _0x5b53c4(_0x4b7daa);},'MHMBW':function(_0x20e52c){return _0x20e52c();}},_0xc1bf40=_0x5c7026(0x1f6)[_0x5c7026(0x1e1)]('|');let _0x2fd766=0x0;while(!![]){switch(_0xc1bf40[_0x2fd766++]){case'0':_0xa9e940[_0x5c7026(0x1e4)](scheduleRetry);continue;case'1':pendingPayloads[_0x5c7026(0x1ee)](_0x2e1a13[_0x5c7026(0x1ec)],_0x2e1a13);continue;case'2':_0xa9e940[_0x5c7026(0x1e4)](bindHmrListenersOnce);continue;case'3':_0xa9e940[_0x5c7026(0x1d9)](trySendNow,_0x2e1a13);continue;case'4':if(!_0xa9e940[_0x5c7026(0x1df)](getHot)?.[_0x5c7026(0x1fb)])return;continue;}break;}}function _0x2309(_0x430de6,_0x57fcd7){_0x430de6=_0x430de6-0x1d9;const _0x499619=_0x4996();let _0x230969=_0x499619[_0x430de6];return _0x230969;}let originalWarnHandler=null;function resendLog(_0x356351,_0x3da909,_0x516101){const _0x1311f0={'wVFvc':function(_0x13aa9d,_0xa23eb2,_0x29aec6,_0x289b11){return _0x13aa9d(_0xa23eb2,_0x29aec6,_0x289b11);}};if(originalWarnHandler)_0x1311f0['wVFvc'](originalWarnHandler,_0x356351,_0x3da909,_0x516101);}function setupVueRootValidator(_0x12bc13,_0x23a0c3={}){const _0x235c3c=_0x52dfa2,_0x5cceb1={'kvPMF':function(_0x44e8c7,_0x163507,_0x415722,_0xa98b65){return _0x44e8c7(_0x163507,_0x415722,_0xa98b65);},'BvtOV':function(_0x4ac6fe,_0x1b1f7e){return _0x4ac6fe&&_0x1b1f7e;},'yzqnJ':function(_0x3097f1,_0x2522f6){return _0x3097f1+_0x2522f6;},'bMSmS':function(_0x21edf9,_0x4f57a8){return _0x21edf9>_0x4f57a8;},'qqhfF':function(_0x483462,_0xebc0b8){return _0x483462-_0xebc0b8;},'JWEMP':function(_0x5ba787,_0x4ea378){return _0x5ba787!==_0x4ea378;},'ZYinO':function(_0x5346a7,_0x10b2ee){return _0x5346a7(_0x10b2ee);},'FgigM':function(_0x35c18c,_0x2e0c23){return _0x35c18c(_0x2e0c23);},'PuwrR':function(_0x1dda31,_0x3b021a){return _0x1dda31(_0x3b021a);},'bUlbj':function(_0x554d66){return _0x554d66();},'OaxYY':function(_0x491120){return _0x491120();}};if(alreadyInstalled())return;_0x5cceb1[_0x235c3c(0x20f)](markInstalled);const _0x462a9c=_0x23a0c3[_0x235c3c(0x1fa)]??'en',_0xfea731=_0x23a0c3[_0x235c3c(0x209)]??![];_0x5cceb1[_0x235c3c(0x1fe)](bindHmrListenersOnce),originalWarnHandler=_0x12bc13[_0x235c3c(0x1da)][_0x235c3c(0x1e6)];let _0x20f31d=0x0,_0x5d29e1='',_0x16740e=![];_0x12bc13[_0x235c3c(0x1da)][_0x235c3c(0x1e6)]=(_0x4dc2f5,_0x215638,_0x21cc07)=>{const _0x93ae3a=_0x235c3c;_0x5cceb1[_0x93ae3a(0x20e)](resendLog,_0x4dc2f5,_0x215638,_0x21cc07);if(_0x5cceb1[_0x93ae3a(0x211)](_0xfea731,_0x16740e))return;if(!_0x4dc2f5[_0x93ae3a(0x1db)](VUE_TRANSITION_WARN))return;const _0x25ff76=Date[_0x93ae3a(0x20c)](),_0x140010=_0x5cceb1[_0x93ae3a(0x207)](_0x4dc2f5,_0x21cc07)[_0x93ae3a(0x1de)](0x0,0x190);if(_0x5cceb1[_0x93ae3a(0x203)](_0x5cceb1[_0x93ae3a(0x205)](_0x25ff76,_0x20f31d),0x1f4)||_0x5cceb1['JWEMP'](_0x140010,_0x5d29e1)){_0x20f31d=_0x25ff76,_0x5d29e1=_0x140010;const _0x513ce7=_0x5cceb1[_0x93ae3a(0x206)](extractRouteKey,_0x21cc07),_0xfee2d8=_0x5cceb1[_0x93ae3a(0x206)](extractComponentName,_0x21cc07),_0x4386c6=_0x5cceb1[_0x93ae3a(0x1e5)](guessViewFileFromInstance,_0x215638),_0x434527=_0x34bb20(_0x462a9c,{'url':getViewUrlFromInstance(_0x215638),'file':_0x4386c6,'routeKey':_0x513ce7,'component':_0xfee2d8});_0x5cceb1[_0x93ae3a(0x1ea)](send,{'key':_0x434527[_0x93ae3a(0x1de)](0x0,0x320),'message':_0x434527,'lang':_0x462a9c}),_0x16740e=!![];}};}export{setupVueRootValidator};
package/dist/index.cjs CHANGED
@@ -1,145 +1 @@
1
- //#region rolldown:runtime
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") {
10
- for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
- key = keys[i];
12
- if (!__hasOwnProp.call(to, key) && key !== except) {
13
- __defProp(to, key, {
14
- get: ((k) => from[k]).bind(null, key),
15
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
- });
17
- }
18
- }
19
- }
20
- return to;
21
- };
22
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
23
- value: mod,
24
- enumerable: true
25
- }) : target, mod));
26
-
27
- //#endregion
28
- const require_i18n = require('./i18n-Ru0ynOFx.cjs');
29
- let node_url = require("node:url");
30
- let node_fs = require("node:fs");
31
- node_fs = __toESM(node_fs);
32
- let path = require("path");
33
- path = __toESM(path);
34
-
35
- //#region src/index.ts
36
- /**
37
- * 发送错误覆盖层到客户端(优先定向发送,避免首屏时广播命中不到当前 client)
38
- */
39
- function sendErrorOverlay(args) {
40
- const { server, message, lang, client, needMergeMessage } = args;
41
- const payload = {
42
- type: "error",
43
- err: {
44
- message: needMergeMessage ? `${require_i18n.getMessageHeader(lang)}\n${message}` : require_i18n.getMessageHeader(lang),
45
- stack: message
46
- }
47
- };
48
- if (client?.send) {
49
- client.send(payload);
50
- return;
51
- }
52
- server.ws.send(payload);
53
- }
54
- /**
55
- * Vite 插件:Vue Root Validator
56
- *
57
- * 用于检测 Vue 组件在 <Transition> 内渲染时的多根节点问题
58
- *
59
- * @returns Vite 插件对象
60
- *
61
- * @example
62
- * ```ts
63
- * // vite.config.ts
64
- * import vitePluginVueTransitionRootValidator from 'vite-plugin-vue-transition-root-validator';
65
- *
66
- * export default defineConfig({
67
- * plugins: [
68
- * vitePluginVueTransitionRootValidator()
69
- * ]
70
- * });
71
- * ```
72
- */
73
- function vitePluginVueTransitionRootValidator() {
74
- let resolved;
75
- let needMergeMessage;
76
- return {
77
- name: "vite-plugin-vue-transition-root-validator",
78
- configResolved(config) {
79
- resolved = config;
80
- const viteVersion = config.version;
81
- const viteMajorVersion = viteVersion ? parseInt(viteVersion.split(".")[0], 10) : 6;
82
- needMergeMessage = isNaN(viteMajorVersion) || viteMajorVersion < 7;
83
- },
84
- configureServer(server) {
85
- if (resolved.command !== "serve") return;
86
- const lastByClient = /* @__PURE__ */ new WeakMap();
87
- server.ws.on("vite-plugin-vue-transition-root-validator:vue-warn", (payload, client) => {
88
- if (!payload?.message) return;
89
- const key = payload.key ?? payload.message.slice(0, 800);
90
- if (lastByClient.get(client) === key) {
91
- client?.send?.("vite-plugin-vue-transition-root-validator:ack", { key });
92
- return;
93
- }
94
- lastByClient.set(client, key);
95
- const effectiveLang = payload.lang ?? "en";
96
- sendErrorOverlay({
97
- server,
98
- message: payload.message,
99
- lang: effectiveLang,
100
- client,
101
- needMergeMessage
102
- });
103
- client?.send?.("vite-plugin-vue-transition-root-validator:ack", { key });
104
- });
105
- },
106
- resolveId(id) {
107
- if (id === "virtual:vue-transition-root-validator") return "\0virtual:vue-transition-root-validator";
108
- return null;
109
- },
110
- load(id) {
111
- if (id === "\0virtual:vue-transition-root-validator") {
112
- const clientEntryTs = (0, node_url.fileURLToPath)(new URL("./client.ts", require("url").pathToFileURL(__filename).href));
113
- const clientEntryJs = (0, node_url.fileURLToPath)(new URL("./client.js", require("url").pathToFileURL(__filename).href));
114
- const clientUrl = `/@fs/${((0, node_fs.existsSync)(clientEntryTs) ? clientEntryTs : clientEntryJs).replace(/\\/g, "/")}`;
115
- return `
116
- // 虚拟模块:vue-transition-root-validator
117
- // 此模块由 vite-plugin-vue-transition-root-validator 插件自动生成
118
-
119
- import { setupVueRootValidator } from ${JSON.stringify(clientUrl)};
120
-
121
- // 重新导出函数
122
- export { setupVueRootValidator };
123
- `;
124
- }
125
- return null;
126
- },
127
- closeBundle() {
128
- try {
129
- if (!resolved.build) return;
130
- const hasSvgBuilder = (resolved.plugins || []).some((p) => p.name === "svg-transform");
131
- console.log("hasSvgBuilder", hasSvgBuilder);
132
- if (hasSvgBuilder) return;
133
- const outDir = resolved.build.outDir;
134
- const htmlFilePath = path.default.resolve(process.cwd(), outDir, "index.html");
135
- console.log("htmlFilePath", htmlFilePath);
136
- if (!node_fs.default.existsSync(htmlFilePath)) return;
137
- node_fs.default.writeFileSync(htmlFilePath, "", "utf-8");
138
- return;
139
- } catch (error) {}
140
- }
141
- };
142
- }
143
-
144
- //#endregion
145
- module.exports = vitePluginVueTransitionRootValidator;
1
+ const _0x564594=_0x5e8b;function _0x5e8b(_0x597b36,_0x1f7b76){_0x597b36=_0x597b36-0x141;const _0x4b8dc2=_0x4b8d();let _0x5e8b2d=_0x4b8dc2[_0x597b36];return _0x5e8b2d;}(function(_0xec0093,_0x4bd937){const _0x4ed1a6=_0x5e8b,_0xaeb344=_0xec0093();while(!![]){try{const _0x3d50d5=-parseInt(_0x4ed1a6(0x176))/0x1+-parseInt(_0x4ed1a6(0x14f))/0x2*(parseInt(_0x4ed1a6(0x181))/0x3)+-parseInt(_0x4ed1a6(0x14a))/0x4+parseInt(_0x4ed1a6(0x148))/0x5+-parseInt(_0x4ed1a6(0x149))/0x6*(-parseInt(_0x4ed1a6(0x16a))/0x7)+parseInt(_0x4ed1a6(0x159))/0x8*(parseInt(_0x4ed1a6(0x163))/0x9)+-parseInt(_0x4ed1a6(0x150))/0xa*(-parseInt(_0x4ed1a6(0x151))/0xb);if(_0x3d50d5===_0x4bd937)break;else _0xaeb344['push'](_0xaeb344['shift']());}catch(_0x41a4ea){_0xaeb344['push'](_0xaeb344['shift']());}}}(_0x4b8d,0xf002d));var __create=Object[_0x564594(0x16d)],__defProp=Object[_0x564594(0x18a)],__getOwnPropDesc=Object[_0x564594(0x17d)],__getOwnPropNames=Object[_0x564594(0x188)],__getProtoOf=Object[_0x564594(0x17c)],__hasOwnProp=Object[_0x564594(0x180)][_0x564594(0x174)],__copyProps=(_0x496aa0,_0x56a205,_0x1ea24e,_0x2bbb71)=>{const _0x49ea44=_0x564594,_0x2a4a0c={'Piurx':function(_0x16194d,_0x4096cc){return _0x16194d===_0x4096cc;},'onqoI':_0x49ea44(0x14d),'iqNfb':_0x49ea44(0x157),'KpqCH':function(_0x1be769,_0x5d2c3a){return _0x1be769!==_0x5d2c3a;},'uswrG':function(_0x39fb7b,_0x41c0e7,_0x1fcc35,_0xa23eda){return _0x39fb7b(_0x41c0e7,_0x1fcc35,_0xa23eda);},'RdMld':function(_0x5688b9,_0x471ab1,_0xfc0104){return _0x5688b9(_0x471ab1,_0xfc0104);}};if(_0x56a205&&_0x2a4a0c['Piurx'](typeof _0x56a205,_0x2a4a0c[_0x49ea44(0x17b)])||_0x2a4a0c[_0x49ea44(0x17a)](typeof _0x56a205,_0x2a4a0c[_0x49ea44(0x16c)]))for(var _0x34caec=__getOwnPropNames(_0x56a205),_0x53b78d=0x0,_0x33e39a=_0x34caec[_0x49ea44(0x14b)],_0x1ddd49;_0x53b78d<_0x33e39a;_0x53b78d++){_0x1ddd49=_0x34caec[_0x53b78d],!__hasOwnProp['call'](_0x496aa0,_0x1ddd49)&&_0x2a4a0c[_0x49ea44(0x16f)](_0x1ddd49,_0x1ea24e)&&_0x2a4a0c[_0x49ea44(0x18e)](__defProp,_0x496aa0,_0x1ddd49,{'get':(_0x3dee53=>_0x56a205[_0x3dee53])[_0x49ea44(0x15d)](null,_0x1ddd49),'enumerable':!(_0x2bbb71=_0x2a4a0c[_0x49ea44(0x185)](__getOwnPropDesc,_0x56a205,_0x1ddd49))||_0x2bbb71[_0x49ea44(0x183)]});}return _0x496aa0;},__toESM=(_0x1918ff,_0x368909,_0x51de09)=>(_0x51de09=_0x1918ff!=null?__create(__getProtoOf(_0x1918ff)):{},__copyProps(_0x368909||!_0x1918ff||!_0x1918ff[_0x564594(0x189)]?__defProp(_0x51de09,_0x564594(0x173),{'value':_0x1918ff,'enumerable':!![]}):_0x51de09,_0x1918ff));const require_i18n=require(_0x564594(0x182));function _0x4b8d(){const _0x473d59=['needMergeMessage',';\x0a\x0a//\x20重新导出函数\x0aexport\x20{\x20setupVueRootValidator\x20};\x0a','GxHPy','command','lang','2169120TdxbOe','66ovrGrQ','2165136TDevBB','length','log','object','build','12674srNFlI','40xkUvVN','2636073JuaYUJ','resolve','node:fs','href','server','existsSync','function','vite-plugin-vue-transition-root-validator:ack','8rJgTZQ','\x0a//\x20虚拟模块:vue-transition-root-validator\x0a//\x20此模块由\x20vite-plugin-vue-transition-root-validator\x20插件自动生成\x0a\x0aimport\x20{\x20setupVueRootValidator\x20}\x20from\x20','pQQFh','plugins','bind','virtual:vue-transition-root-validator','getMessageHeader','pathToFileURL','qtlUq','./client.js','12121929zPbQYQ','key','hoXoH','xiHAK','cwd','path','exports','143731mnwHCx','htmlFilePath','iqNfb','create','./client.ts','KpqCH','RUQzY','svg-transform','utf-8','default','hasOwnProperty','node:url','1320368nmqemV','fileURLToPath','index.html','send','Piurx','onqoI','getPrototypeOf','getOwnPropertyDescriptor','message','DrMtQ','prototype','57ANIcnA','./i18n-Ru0ynOFx.cjs','enumerable','version','RdMld','replace','split','getOwnPropertyNames','__esModule','defineProperty','some','ZEBke','outDir','uswrG','url','vite-plugin-vue-transition-root-validator','/@fs/','name','eIWVR','writeFileSync'];_0x4b8d=function(){return _0x473d59;};return _0x4b8d();}let node_url=require(_0x564594(0x175)),node_fs=require(_0x564594(0x153));node_fs=__toESM(node_fs);let path=require(_0x564594(0x168));path=__toESM(path);function sendErrorOverlay(_0x167405){const _0x54f58b=_0x564594,_0x3ba6b9={};_0x3ba6b9[_0x54f58b(0x165)]='error';const _0x589a50=_0x3ba6b9,{server:_0x54fe5e,message:_0xe0c948,lang:_0x5a1da1,client:_0x140a9f,needMergeMessage:_0x4a1817}=_0x167405,_0x1aaf77={'type':_0x589a50[_0x54f58b(0x165)],'err':{'message':_0x4a1817?require_i18n[_0x54f58b(0x15f)](_0x5a1da1)+'\x0a'+_0xe0c948:require_i18n[_0x54f58b(0x15f)](_0x5a1da1),'stack':_0xe0c948}};if(_0x140a9f?.[_0x54f58b(0x179)]){_0x140a9f[_0x54f58b(0x179)](_0x1aaf77);return;}_0x54fe5e['ws'][_0x54f58b(0x179)](_0x1aaf77);}function vitePluginVueTransitionRootValidator(){const _0x264c61=_0x564594,_0x2607f6={'UmfPn':function(_0x4693bb,_0x2bcdde,_0x21ad4c){return _0x4693bb(_0x2bcdde,_0x21ad4c);},'ZEBke':function(_0x2fc002,_0x52907b){return _0x2fc002(_0x52907b);},'xiHAK':'serve','kueNt':'vite-plugin-vue-transition-root-validator:vue-warn','TrvTd':_0x264c61(0x15e),'pQQFh':'\x00virtual:vue-transition-root-validator','DrMtQ':function(_0x17d657,_0x1bb6dd){return _0x17d657===_0x1bb6dd;},'qtlUq':function(_0x44f9f1,_0x1f23f7){return _0x44f9f1(_0x1f23f7);},'GxHPy':_0x264c61(0x18f),'UuaCs':_0x264c61(0x162),'BeYKv':_0x264c61(0x178),'RUQzY':_0x264c61(0x16b),'eIWVR':_0x264c61(0x190)};let _0x309ebc,_0x16446d;return{'name':_0x2607f6[_0x264c61(0x141)],'configResolved'(_0x2d5a58){const _0x257fb3=_0x264c61;_0x309ebc=_0x2d5a58;const _0x5ca083=_0x2d5a58[_0x257fb3(0x184)],_0x3ec9d7=_0x5ca083?_0x2607f6['UmfPn'](parseInt,_0x5ca083[_0x257fb3(0x187)]('.')[0x0],0xa):0x6;_0x16446d=_0x2607f6[_0x257fb3(0x18c)](isNaN,_0x3ec9d7)||_0x3ec9d7<0x7;},'configureServer'(_0x27dbdb){const _0x36af38=_0x264c61;if(_0x309ebc[_0x36af38(0x146)]!==_0x2607f6[_0x36af38(0x166)])return;const _0x13a483=new WeakMap();_0x27dbdb['ws']['on'](_0x2607f6['kueNt'],(_0x40dd75,_0x175292)=>{const _0x2669a8=_0x36af38;if(!_0x40dd75?.[_0x2669a8(0x17e)])return;const _0xb3bd7f=_0x40dd75[_0x2669a8(0x164)]??_0x40dd75[_0x2669a8(0x17e)]['slice'](0x0,0x320);if(_0x13a483['get'](_0x175292)===_0xb3bd7f){const _0x3af456={};_0x3af456[_0x2669a8(0x164)]=_0xb3bd7f,_0x175292?.['send']?.(_0x2669a8(0x158),_0x3af456);return;}_0x13a483['set'](_0x175292,_0xb3bd7f);const _0x6fa398=_0x40dd75[_0x2669a8(0x147)]??'en',_0x4e7050={};_0x4e7050[_0x2669a8(0x155)]=_0x27dbdb,_0x4e7050[_0x2669a8(0x17e)]=_0x40dd75[_0x2669a8(0x17e)],_0x4e7050['lang']=_0x6fa398,_0x4e7050['client']=_0x175292,_0x4e7050[_0x2669a8(0x143)]=_0x16446d,_0x2607f6[_0x2669a8(0x18c)](sendErrorOverlay,_0x4e7050);const _0xf995bf={};_0xf995bf[_0x2669a8(0x164)]=_0xb3bd7f,_0x175292?.[_0x2669a8(0x179)]?.(_0x2669a8(0x158),_0xf995bf);});},'resolveId'(_0x51a233){if(_0x51a233===_0x2607f6['TrvTd'])return _0x2607f6['pQQFh'];return null;},'load'(_0x4dc0f1){const _0x1b3254=_0x264c61;if(_0x2607f6[_0x1b3254(0x17f)](_0x4dc0f1,_0x2607f6[_0x1b3254(0x15b)])){const _0x3e2302=(0x0,node_url[_0x1b3254(0x177)])(new URL(_0x1b3254(0x16e),_0x2607f6[_0x1b3254(0x161)](require,_0x2607f6[_0x1b3254(0x145)])[_0x1b3254(0x160)](__filename)[_0x1b3254(0x154)])),_0x26b99d=(0x0,node_url[_0x1b3254(0x177)])(new URL(_0x2607f6['UuaCs'],_0x2607f6[_0x1b3254(0x18c)](require,_0x2607f6[_0x1b3254(0x145)])[_0x1b3254(0x160)](__filename)[_0x1b3254(0x154)])),_0x3a589b=_0x1b3254(0x191)+((0x0,node_fs[_0x1b3254(0x156)])(_0x3e2302)?_0x3e2302:_0x26b99d)[_0x1b3254(0x186)](/\\/g,'/');return _0x1b3254(0x15a)+JSON['stringify'](_0x3a589b)+_0x1b3254(0x144);}return null;},'closeBundle'(){const _0x1c0f76=_0x264c61;try{if(!_0x309ebc[_0x1c0f76(0x14e)])return;const _0x2a833d=(_0x309ebc[_0x1c0f76(0x15c)]||[])[_0x1c0f76(0x18b)](_0x2c017b=>_0x2c017b[_0x1c0f76(0x192)]===_0x1c0f76(0x171));console[_0x1c0f76(0x14c)]('hasSvgBuilder',_0x2a833d);if(_0x2a833d)return;const _0x2ad58e=_0x309ebc['build'][_0x1c0f76(0x18d)],_0x130605=path['default'][_0x1c0f76(0x152)](_0x309ebc['root']||process[_0x1c0f76(0x167)](),_0x2ad58e,_0x2607f6['BeYKv']);console[_0x1c0f76(0x14c)](_0x2607f6[_0x1c0f76(0x170)],_0x130605);if(!node_fs[_0x1c0f76(0x173)][_0x1c0f76(0x156)](_0x130605))return;node_fs[_0x1c0f76(0x173)][_0x1c0f76(0x142)](_0x130605,'',_0x1c0f76(0x172));return;}catch(_0x155b86){}}};}module[_0x564594(0x169)]=vitePluginVueTransitionRootValidator;
package/dist/index.js CHANGED
@@ -1,117 +1 @@
1
- import { n as getMessageHeader } from "./i18n-BulTAahL.js";
2
- import { fileURLToPath } from "node:url";
3
- import fs, { existsSync } from "node:fs";
4
- import path from "path";
5
-
6
- //#region src/index.ts
7
- /**
8
- * 发送错误覆盖层到客户端(优先定向发送,避免首屏时广播命中不到当前 client)
9
- */
10
- function sendErrorOverlay(args) {
11
- const { server, message, lang, client, needMergeMessage } = args;
12
- const payload = {
13
- type: "error",
14
- err: {
15
- message: needMergeMessage ? `${getMessageHeader(lang)}\n${message}` : getMessageHeader(lang),
16
- stack: message
17
- }
18
- };
19
- if (client?.send) {
20
- client.send(payload);
21
- return;
22
- }
23
- server.ws.send(payload);
24
- }
25
- /**
26
- * Vite 插件:Vue Root Validator
27
- *
28
- * 用于检测 Vue 组件在 <Transition> 内渲染时的多根节点问题
29
- *
30
- * @returns Vite 插件对象
31
- *
32
- * @example
33
- * ```ts
34
- * // vite.config.ts
35
- * import vitePluginVueTransitionRootValidator from 'vite-plugin-vue-transition-root-validator';
36
- *
37
- * export default defineConfig({
38
- * plugins: [
39
- * vitePluginVueTransitionRootValidator()
40
- * ]
41
- * });
42
- * ```
43
- */
44
- function vitePluginVueTransitionRootValidator() {
45
- let resolved;
46
- let needMergeMessage;
47
- return {
48
- name: "vite-plugin-vue-transition-root-validator",
49
- configResolved(config) {
50
- resolved = config;
51
- const viteVersion = config.version;
52
- const viteMajorVersion = viteVersion ? parseInt(viteVersion.split(".")[0], 10) : 6;
53
- needMergeMessage = isNaN(viteMajorVersion) || viteMajorVersion < 7;
54
- },
55
- configureServer(server) {
56
- if (resolved.command !== "serve") return;
57
- const lastByClient = /* @__PURE__ */ new WeakMap();
58
- server.ws.on("vite-plugin-vue-transition-root-validator:vue-warn", (payload, client) => {
59
- if (!payload?.message) return;
60
- const key = payload.key ?? payload.message.slice(0, 800);
61
- if (lastByClient.get(client) === key) {
62
- client?.send?.("vite-plugin-vue-transition-root-validator:ack", { key });
63
- return;
64
- }
65
- lastByClient.set(client, key);
66
- const effectiveLang = payload.lang ?? "en";
67
- sendErrorOverlay({
68
- server,
69
- message: payload.message,
70
- lang: effectiveLang,
71
- client,
72
- needMergeMessage
73
- });
74
- client?.send?.("vite-plugin-vue-transition-root-validator:ack", { key });
75
- });
76
- },
77
- resolveId(id) {
78
- if (id === "virtual:vue-transition-root-validator") return "\0virtual:vue-transition-root-validator";
79
- return null;
80
- },
81
- load(id) {
82
- if (id === "\0virtual:vue-transition-root-validator") {
83
- const clientEntryTs = fileURLToPath(new URL("./client.ts", import.meta.url));
84
- const clientEntryJs = fileURLToPath(new URL("./client.js", import.meta.url));
85
- const clientUrl = `/@fs/${(existsSync(clientEntryTs) ? clientEntryTs : clientEntryJs).replace(/\\/g, "/")}`;
86
- return `
87
- // 虚拟模块:vue-transition-root-validator
88
- // 此模块由 vite-plugin-vue-transition-root-validator 插件自动生成
89
-
90
- import { setupVueRootValidator } from ${JSON.stringify(clientUrl)};
91
-
92
- // 重新导出函数
93
- export { setupVueRootValidator };
94
- `;
95
- }
96
- return null;
97
- },
98
- closeBundle() {
99
- try {
100
- if (!resolved.build) return;
101
- const hasSvgBuilder = (resolved.plugins || []).some((p) => p.name === "svg-transform");
102
- console.log("hasSvgBuilder", hasSvgBuilder);
103
- if (hasSvgBuilder) return;
104
- const outDir = resolved.build.outDir;
105
- const htmlFilePath = path.resolve(process.cwd(), outDir, "index.html");
106
- console.log("htmlFilePath", htmlFilePath);
107
- if (!fs.existsSync(htmlFilePath)) return;
108
- fs.writeFileSync(htmlFilePath, "", "utf-8");
109
- return;
110
- } catch (error) {}
111
- }
112
- };
113
- }
114
-
115
- //#endregion
116
- export { vitePluginVueTransitionRootValidator as default };
117
- //# sourceMappingURL=index.js.map
1
+ (function(_0x32248f,_0x123772){const _0x59a4ad=_0x1d54,_0x1fbb3c=_0x32248f();while(!![]){try{const _0x1f62ab=-parseInt(_0x59a4ad(0x1ac))/0x1*(parseInt(_0x59a4ad(0x181))/0x2)+parseInt(_0x59a4ad(0x1ad))/0x3*(parseInt(_0x59a4ad(0x1ab))/0x4)+-parseInt(_0x59a4ad(0x18f))/0x5*(-parseInt(_0x59a4ad(0x179))/0x6)+parseInt(_0x59a4ad(0x196))/0x7*(parseInt(_0x59a4ad(0x193))/0x8)+-parseInt(_0x59a4ad(0x1a9))/0x9+parseInt(_0x59a4ad(0x1a4))/0xa+parseInt(_0x59a4ad(0x191))/0xb*(-parseInt(_0x59a4ad(0x1a2))/0xc);if(_0x1f62ab===_0x123772)break;else _0x1fbb3c['push'](_0x1fbb3c['shift']());}catch(_0x2bcec1){_0x1fbb3c['push'](_0x1fbb3c['shift']());}}}(_0x4a23,0xe775c));import{n as _0x291b0d}from'./i18n-BulTAahL.js';import{fileURLToPath}from'node:url';function _0x4a23(){const _0x2a9044=['some','976895JlHRGB','needMergeMessage','11qsHzfh','log','3320104iHGeyQ','key','get','21KPglWJ','command','nQUXb','pnzUK','outDir','server','nJRub','ZYVbD','set','resolve',';\x0a\x0a//\x20重新导出函数\x0aexport\x20{\x20setupVueRootValidator\x20};\x0a','vite-plugin-vue-transition-root-validator:vue-warn','20582916PvKOCA','stringify','17416090pvGzIF','\x0a//\x20虚拟模块:vue-transition-root-validator\x0a//\x20此模块由\x20vite-plugin-vue-transition-root-validator\x20插件自动生成\x0a\x0aimport\x20{\x20setupVueRootValidator\x20}\x20from\x20','virtual:vue-transition-root-validator','gzxkD','QemzY','11084508nvmnwf','lang','2406276FIwhme','2713YNYtLH','3hYUxkr','YvIUs','replace','build','slice','/@fs/','message','Zcqxg','18tepyKd','ngRxh','EXUgg','htmlFilePath','./client.ts','kNtyh','name','OeFOD','206QcTzfT','error','serve','hkdVF','svg-transform','\x00virtual:vue-transition-root-validator','writeFileSync','wBtqq','zEPYb','mWOwV','send','aPCus','vite-plugin-vue-transition-root-validator:ack'];_0x4a23=function(){return _0x2a9044;};return _0x4a23();}function _0x1d54(_0x4db76a,_0x17485b){_0x4db76a=_0x4db76a-0x177;const _0x4a23e5=_0x4a23();let _0x1d5439=_0x4a23e5[_0x4db76a];return _0x1d5439;}import _0x2de84f,{existsSync}from'node:fs';import _0x198a0c from'path';function sendErrorOverlay(_0x2c7e88){const _0x33a8ed=_0x1d54,_0x355174={'nJRub':_0x33a8ed(0x182),'ZYVbD':function(_0x596f96,_0x194416){return _0x596f96(_0x194416);},'uEZXy':function(_0x5a5e15,_0x1a0b82){return _0x5a5e15(_0x1a0b82);}},{server:_0x311ee9,message:_0xfccf9a,lang:_0x5ac1a6,client:_0x5efc66,needMergeMessage:_0x4db719}=_0x2c7e88,_0x1f98ad={'type':_0x355174[_0x33a8ed(0x19c)],'err':{'message':_0x4db719?_0x355174[_0x33a8ed(0x19d)](_0x291b0d,_0x5ac1a6)+'\x0a'+_0xfccf9a:_0x355174['uEZXy'](_0x291b0d,_0x5ac1a6),'stack':_0xfccf9a}};if(_0x5efc66?.[_0x33a8ed(0x18b)]){_0x5efc66[_0x33a8ed(0x18b)](_0x1f98ad);return;}_0x311ee9['ws'][_0x33a8ed(0x18b)](_0x1f98ad);}function vitePluginVueTransitionRootValidator(){const _0x7f32db=_0x1d54,_0x17ffab={'kNtyh':function(_0x3dbbea,_0x238234,_0x2367f9){return _0x3dbbea(_0x238234,_0x2367f9);},'OeFOD':function(_0x7195f0,_0x206593){return _0x7195f0(_0x206593);},'zEPYb':function(_0x144a71,_0x39e4d3){return _0x144a71<_0x39e4d3;},'nQUXb':_0x7f32db(0x18d),'ngRxh':function(_0x362e5a,_0x3a41fc){return _0x362e5a(_0x3a41fc);},'pnzUK':function(_0x3f9cfa,_0x2ea120){return _0x3f9cfa!==_0x2ea120;},'mDFoM':function(_0x2ca3aa,_0x3eb8a3){return _0x2ca3aa===_0x3eb8a3;},'hkdVF':_0x7f32db(0x1a6),'wBtqq':_0x7f32db(0x186),'YvIUs':_0x7f32db(0x17d),'aPCus':function(_0x48c90a,_0x5612ae){return _0x48c90a(_0x5612ae);},'Zcqxg':function(_0x5a5223,_0x594126){return _0x5a5223(_0x594126);},'EXUgg':'index.html','mWOwV':_0x7f32db(0x17c),'QemzY':'utf-8','gzxkD':'vite-plugin-vue-transition-root-validator'};let _0x3be1e5,_0x50ef1f;return{'name':_0x17ffab[_0x7f32db(0x1a7)],'configResolved'(_0xb0262c){const _0x478492=_0x7f32db;_0x3be1e5=_0xb0262c;const _0x52840e=_0xb0262c['version'],_0x5c7b65=_0x52840e?_0x17ffab[_0x478492(0x17e)](parseInt,_0x52840e['split']('.')[0x0],0xa):0x6;_0x50ef1f=_0x17ffab[_0x478492(0x180)](isNaN,_0x5c7b65)||_0x17ffab[_0x478492(0x189)](_0x5c7b65,0x7);},'configureServer'(_0x5632e6){const _0x4d3bfb=_0x7f32db;if(_0x17ffab[_0x4d3bfb(0x199)](_0x3be1e5[_0x4d3bfb(0x197)],_0x4d3bfb(0x183)))return;const _0x396fda=new WeakMap();_0x5632e6['ws']['on'](_0x4d3bfb(0x1a1),(_0x436df9,_0x3079e3)=>{const _0x4675cf=_0x4d3bfb;if(!_0x436df9?.[_0x4675cf(0x177)])return;const _0x4648ac=_0x436df9[_0x4675cf(0x194)]??_0x436df9['message'][_0x4675cf(0x1b1)](0x0,0x320);if(_0x396fda[_0x4675cf(0x195)](_0x3079e3)===_0x4648ac){const _0x4f714d={};_0x4f714d['key']=_0x4648ac,_0x3079e3?.[_0x4675cf(0x18b)]?.(_0x17ffab[_0x4675cf(0x198)],_0x4f714d);return;}_0x396fda[_0x4675cf(0x19e)](_0x3079e3,_0x4648ac);const _0x49d481=_0x436df9[_0x4675cf(0x1aa)]??'en',_0x1dec92={};_0x1dec92[_0x4675cf(0x19b)]=_0x5632e6,_0x1dec92[_0x4675cf(0x177)]=_0x436df9['message'],_0x1dec92[_0x4675cf(0x1aa)]=_0x49d481,_0x1dec92['client']=_0x3079e3,_0x1dec92[_0x4675cf(0x190)]=_0x50ef1f,_0x17ffab[_0x4675cf(0x17a)](sendErrorOverlay,_0x1dec92);const _0x22fb8a={};_0x22fb8a[_0x4675cf(0x194)]=_0x4648ac,_0x3079e3?.[_0x4675cf(0x18b)]?.(_0x4675cf(0x18d),_0x22fb8a);});},'resolveId'(_0x2656b9){const _0xa17171=_0x7f32db;if(_0x17ffab['mDFoM'](_0x2656b9,_0x17ffab[_0xa17171(0x184)]))return _0x17ffab[_0xa17171(0x188)];return null;},'load'(_0x1dc81c){const _0x1bd177=_0x7f32db;if(_0x1dc81c===_0x17ffab[_0x1bd177(0x188)]){const _0x165477=fileURLToPath(new URL(_0x17ffab[_0x1bd177(0x1ae)],import.meta.url)),_0x322728=_0x17ffab[_0x1bd177(0x18c)](fileURLToPath,new URL('./client.js',import.meta.url)),_0x573a59=_0x1bd177(0x1b2)+(_0x17ffab[_0x1bd177(0x178)](existsSync,_0x165477)?_0x165477:_0x322728)[_0x1bd177(0x1af)](/\\/g,'/');return _0x1bd177(0x1a5)+JSON[_0x1bd177(0x1a3)](_0x573a59)+_0x1bd177(0x1a0);}return null;},'closeBundle'(){const _0x4a3fc2=_0x7f32db;try{if(!_0x3be1e5[_0x4a3fc2(0x1b0)])return;const _0x15979c=(_0x3be1e5['plugins']||[])[_0x4a3fc2(0x18e)](_0x4ccd67=>_0x4ccd67[_0x4a3fc2(0x17f)]===_0x4a3fc2(0x185));console['log']('hasSvgBuilder',_0x15979c);if(_0x15979c)return;const _0x2ba667=_0x3be1e5[_0x4a3fc2(0x1b0)][_0x4a3fc2(0x19a)],_0xd62ecb=_0x198a0c[_0x4a3fc2(0x19f)](_0x3be1e5['root']||process['cwd'](),_0x2ba667,_0x17ffab[_0x4a3fc2(0x17b)]);console[_0x4a3fc2(0x192)](_0x17ffab[_0x4a3fc2(0x18a)],_0xd62ecb);if(!_0x2de84f['existsSync'](_0xd62ecb))return;_0x2de84f[_0x4a3fc2(0x187)](_0xd62ecb,'',_0x17ffab[_0x4a3fc2(0x1a8)]);return;}catch(_0x3a98a1){}}};}export{vitePluginVueTransitionRootValidator as default};
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url';\nimport fs, { existsSync } from 'node:fs';\nimport path from 'path';\nimport { resolve } from 'node:path';\nimport type { Lang } from './types.ts';\nimport { getMessageHeader } from './i18n.ts';\n\n/**\n * Vite DevServer 类型(精简版)\n */\ntype DevServerLike = {\n ws: {\n send: (payload: { type: 'error'; err: { message: string; stack?: string } }) => void;\n on: (event: string, listener: (payload: any, client: any) => void) => void;\n };\n config: {\n logger: {\n warn: (msg: string) => void;\n info: (msg: string) => void;\n };\n };\n};\n\ntype DevClientLike = {\n send?: {\n (payload: { type: 'error'; err: { message: string; stack?: string } }): void;\n (event: string, payload?: any): void;\n };\n};\n\n/**\n * Vite ResolvedConfig 类型(精简版)\n */\ntype ResolvedConfigLike = {\n command: 'serve' | 'build' | string;\n version?: string;\n plugins?: any[];\n build?: {\n outDir: string;\n\n };\n root?: string;\n};\n\n/**\n * 发送错误覆盖层到客户端(优先定向发送,避免首屏时广播命中不到当前 client)\n */\nfunction sendErrorOverlay(args: { server: DevServerLike; message: string; lang: Lang; client?: DevClientLike; needMergeMessage: boolean }) {\n const { server, message, lang, client, needMergeMessage } = args;\n\n const fullMessage = needMergeMessage ? `${getMessageHeader(lang)}\\n${message}` : getMessageHeader(lang);\n\n const payload = {\n type: 'error',\n err: {\n message: fullMessage,\n stack: message,\n },\n } as const;\n\n if (client?.send) {\n client.send(payload);\n return;\n }\n\n server.ws.send(payload);\n}\n\n/**\n * 客户端上报的消息载荷\n */\ntype ClientReportPayload = {\n message: string;\n /** 用于 ACK 去重/确认(客户端可不传,服务端会回退使用 message 截断值) */\n key?: string;\n /** 客户端运行时语言(推荐从 main.ts 传入并上报),用于决定 overlay header 语言 */\n lang?: Lang;\n};\n\n/**\n * Vite 插件:Vue Root Validator\n *\n * 用于检测 Vue 组件在 <Transition> 内渲染时的多根节点问题\n *\n * @returns Vite 插件对象\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import vitePluginVueTransitionRootValidator from 'vite-plugin-vue-transition-root-validator';\n *\n * export default defineConfig({\n * plugins: [\n * vitePluginVueTransitionRootValidator()\n * ]\n * });\n * ```\n */\nexport default function vitePluginVueTransitionRootValidator() {\n let resolved: ResolvedConfigLike;\n let needMergeMessage: boolean;\n\n return {\n name: 'vite-plugin-vue-transition-root-validator',\n\n /**\n * 保存解析后的配置\n */\n configResolved(config: ResolvedConfigLike) {\n resolved = config;\n // 判断 Vite 版本:7 以下需要把 stack 合入 message\n const viteVersion = config.version;\n const viteMajorVersion = viteVersion ? parseInt(viteVersion.split('.')[0], 10) : 6;\n needMergeMessage = isNaN(viteMajorVersion) || viteMajorVersion < 7;\n },\n\n /**\n * 配置开发服务器\n * 监听客户端上报的警告消息,并通过 error overlay 显示\n */\n configureServer(server: DevServerLike) {\n if (resolved.command !== 'serve') return;\n\n // 用于去重,避免同一客户端重复发送相同消息\n const lastByClient = new WeakMap<object, string>();\n\n // 监听客户端上报的警告\n server.ws.on('vite-plugin-vue-transition-root-validator:vue-warn', (payload: ClientReportPayload, client: object) => {\n if (!payload?.message) return;\n\n // 去重处理\n const key = payload.key ?? payload.message.slice(0, 800);\n const prev = lastByClient.get(client as unknown as object);\n if (prev === key) {\n // 仍然回 ACK,避免客户端重试积压\n (client as any as DevClientLike)?.send?.('vite-plugin-vue-transition-root-validator:ack', { key });\n return;\n }\n lastByClient.set(client as unknown as object, key);\n\n const effectiveLang: Lang = payload.lang ?? 'en';\n\n // 发送错误覆盖层\n sendErrorOverlay({\n server,\n message: payload.message,\n lang: effectiveLang,\n client: client as any as DevClientLike,\n needMergeMessage\n });\n\n // 回 ACK,通知客户端该消息已被处理(用于清理重试队列)\n (client as any as DevClientLike)?.send?.('vite-plugin-vue-transition-root-validator:ack', { key });\n });\n },\n\n /**\n * 解析虚拟模块\n * 处理 'virtual:vue-transition-root-validator' 模块的导入\n */\n resolveId(id: string) {\n if (id === 'virtual:vue-transition-root-validator') {\n // 返回一个虚拟模块 ID,加上 \\0 前缀表示这是一个虚拟模块\n return '\\0virtual:vue-transition-root-validator';\n }\n return null;\n },\n\n /**\n * 加载虚拟模块\n * 返回虚拟模块的代码内容\n */\n load(id: string) {\n if (id === '\\0virtual:vue-transition-root-validator') {\n const clientEntryTs = fileURLToPath(new URL('./client.ts', import.meta.url));\n const clientEntryJs = fileURLToPath(new URL('./client.js', import.meta.url));\n const clientEntry = existsSync(clientEntryTs) ? clientEntryTs : clientEntryJs;\n const clientUrl = `/@fs/${clientEntry.replace(/\\\\/g, '/')}`;\n\n // 返回虚拟模块代码:重新导出 client.ts 的函数\n return `\n// 虚拟模块:vue-transition-root-validator\n// 此模块由 vite-plugin-vue-transition-root-validator 插件自动生成\n\nimport { setupVueRootValidator } from ${JSON.stringify(clientUrl)};\n\n// 重新导出函数\nexport { setupVueRootValidator };\n`;\n }\n return null;\n },\n\n closeBundle() {\n try {\n // 1. 获取 Vite 打包的输出目录(默认 dist,支持用户自定义配置)\n if (!resolved.build) {\n return;\n }\n\n // 3. 判断插件是否存在\n const plugins = resolved.plugins || [];\n const hasSvgBuilder = plugins.some((p: any) => p.name === 'svg-transform');\n\n console.log('hasSvgBuilder',hasSvgBuilder)\n if (hasSvgBuilder) {\n return\n }\n\n // 4. 满足条件,将 HTML 文件内容置空(写入空字符串)\n const outDir = resolved.build.outDir;\n // 拼接 HTML 文件的完整路径(默认打包生成 index.html,支持自定义 HTML 文件名)\n const htmlFilePath = path.resolve(process.cwd(), outDir, 'index.html');\n\n console.log('htmlFilePath',htmlFilePath)\n // 2. 先判断 HTML 文件是否存在(避免文件不存在导致写入报错)\n if (!fs.existsSync(htmlFilePath)) {\n return;\n }\n\n fs.writeFileSync(htmlFilePath, '', 'utf-8');\n return;\n\n } catch (error: any) {\n // 捕获异常,避免插件报错导致整个打包流程异常终止\n }\n\n }\n };\n}\n\n\n"],"mappings":";;;;;;;;;AA+CA,SAAS,iBAAiB,MAAiH;CACzI,MAAM,EAAE,QAAQ,SAAS,MAAM,QAAQ,qBAAqB;CAI5D,MAAM,UAAU;EACd,MAAM;EACN,KAAK;GACH,SALgB,mBAAmB,GAAG,iBAAiB,KAAK,CAAC,IAAI,YAAY,iBAAiB,KAAK;GAMnG,OAAO;GACR;EACF;AAED,KAAI,QAAQ,MAAM;AAChB,SAAO,KAAK,QAAQ;AACpB;;AAGF,QAAO,GAAG,KAAK,QAAQ;;;;;;;;;;;;;;;;;;;;;AAiCzB,SAAwB,uCAAuC;CAC7D,IAAI;CACJ,IAAI;AAEJ,QAAO;EACL,MAAM;EAKN,eAAe,QAA4B;AACzC,cAAW;GAEX,MAAM,cAAc,OAAO;GAC3B,MAAM,mBAAmB,cAAc,SAAS,YAAY,MAAM,IAAI,CAAC,IAAI,GAAG,GAAG;AACjF,sBAAmB,MAAM,iBAAiB,IAAI,mBAAmB;;EAOnE,gBAAgB,QAAuB;AACrC,OAAI,SAAS,YAAY,QAAS;GAGlC,MAAM,+BAAe,IAAI,SAAyB;AAGlD,UAAO,GAAG,GAAG,uDAAuD,SAA8B,WAAmB;AACnH,QAAI,CAAC,SAAS,QAAS;IAGvB,MAAM,MAAM,QAAQ,OAAO,QAAQ,QAAQ,MAAM,GAAG,IAAI;AAExD,QADa,aAAa,IAAI,OAA4B,KAC7C,KAAK;AAEhB,KAAC,QAAiC,OAAO,iDAAiD,EAAE,KAAK,CAAC;AAClG;;AAEF,iBAAa,IAAI,QAA6B,IAAI;IAElD,MAAM,gBAAsB,QAAQ,QAAQ;AAG5C,qBAAiB;KACf;KACA,SAAS,QAAQ;KACjB,MAAM;KACE;KACR;KACD,CAAC;AAGF,IAAC,QAAiC,OAAO,iDAAiD,EAAE,KAAK,CAAC;KAClG;;EAOJ,UAAU,IAAY;AACpB,OAAI,OAAO,wCAET,QAAO;AAET,UAAO;;EAOT,KAAK,IAAY;AACf,OAAI,OAAO,2CAA2C;IACpD,MAAM,gBAAgB,cAAc,IAAI,IAAI,eAAe,OAAO,KAAK,IAAI,CAAC;IAC5E,MAAM,gBAAgB,cAAc,IAAI,IAAI,eAAe,OAAO,KAAK,IAAI,CAAC;IAE5E,MAAM,YAAY,SADE,WAAW,cAAc,GAAG,gBAAgB,eAC1B,QAAQ,OAAO,IAAI;AAGzD,WAAO;;;;wCAIyB,KAAK,UAAU,UAAU,CAAC;;;;;;AAM5D,UAAO;;EAGT,cAAc;AACZ,OAAI;AAEF,QAAI,CAAC,SAAS,MACZ;IAKF,MAAM,iBADU,SAAS,WAAW,EAAE,EACR,MAAM,MAAW,EAAE,SAAS,gBAAgB;AAE1E,YAAQ,IAAI,iBAAgB,cAAc;AAC1C,QAAI,cACF;IAIF,MAAM,SAAS,SAAS,MAAM;IAE9B,MAAM,eAAe,KAAK,QAAQ,QAAQ,KAAK,EAAE,QAAQ,aAAa;AAEtE,YAAQ,IAAI,gBAAe,aAAa;AAExC,QAAI,CAAC,GAAG,WAAW,aAAa,CAC9B;AAGF,OAAG,cAAc,cAAc,IAAI,QAAQ;AAC3C;YAEO,OAAY;;EAKxB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url';\nimport fs, { existsSync } from 'node:fs';\nimport path from 'path';\nimport { resolve } from 'node:path';\nimport type { Lang } from './types.ts';\nimport { getMessageHeader } from './i18n.ts';\n\n/**\n * Vite DevServer 类型(精简版)\n */\ntype DevServerLike = {\n ws: {\n send: (payload: { type: 'error'; err: { message: string; stack?: string } }) => void;\n on: (event: string, listener: (payload: any, client: any) => void) => void;\n };\n config: {\n logger: {\n warn: (msg: string) => void;\n info: (msg: string) => void;\n };\n };\n};\n\ntype DevClientLike = {\n send?: {\n (payload: { type: 'error'; err: { message: string; stack?: string } }): void;\n (event: string, payload?: any): void;\n };\n};\n\n/**\n * Vite ResolvedConfig 类型(精简版)\n */\ntype ResolvedConfigLike = {\n command: 'serve' | 'build' | string;\n version?: string;\n plugins?: any[];\n build?: {\n outDir: string;\n\n };\n root?: string;\n};\n\n/**\n * 发送错误覆盖层到客户端(优先定向发送,避免首屏时广播命中不到当前 client)\n */\nfunction sendErrorOverlay(args: { server: DevServerLike; message: string; lang: Lang; client?: DevClientLike; needMergeMessage: boolean }) {\n const { server, message, lang, client, needMergeMessage } = args;\n\n const fullMessage = needMergeMessage ? `${getMessageHeader(lang)}\\n${message}` : getMessageHeader(lang);\n\n const payload = {\n type: 'error',\n err: {\n message: fullMessage,\n stack: message,\n },\n } as const;\n\n if (client?.send) {\n client.send(payload);\n return;\n }\n\n server.ws.send(payload);\n}\n\n/**\n * 客户端上报的消息载荷\n */\ntype ClientReportPayload = {\n message: string;\n /** 用于 ACK 去重/确认(客户端可不传,服务端会回退使用 message 截断值) */\n key?: string;\n /** 客户端运行时语言(推荐从 main.ts 传入并上报),用于决定 overlay header 语言 */\n lang?: Lang;\n};\n\n/**\n * Vite 插件:Vue Root Validator\n *\n * 用于检测 Vue 组件在 <Transition> 内渲染时的多根节点问题\n *\n * @returns Vite 插件对象\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import vitePluginVueTransitionRootValidator from 'vite-plugin-vue-transition-root-validator';\n *\n * export default defineConfig({\n * plugins: [\n * vitePluginVueTransitionRootValidator()\n * ]\n * });\n * ```\n */\nexport default function vitePluginVueTransitionRootValidator() {\n let resolved: ResolvedConfigLike;\n let needMergeMessage: boolean;\n\n return {\n name: 'vite-plugin-vue-transition-root-validator',\n\n /**\n * 保存解析后的配置\n */\n configResolved(config: ResolvedConfigLike) {\n resolved = config;\n // 判断 Vite 版本:7 以下需要把 stack 合入 message\n const viteVersion = config.version;\n const viteMajorVersion = viteVersion ? parseInt(viteVersion.split('.')[0], 10) : 6;\n needMergeMessage = isNaN(viteMajorVersion) || viteMajorVersion < 7;\n },\n\n /**\n * 配置开发服务器\n * 监听客户端上报的警告消息,并通过 error overlay 显示\n */\n configureServer(server: DevServerLike) {\n if (resolved.command !== 'serve') return;\n\n // 用于去重,避免同一客户端重复发送相同消息\n const lastByClient = new WeakMap<object, string>();\n\n // 监听客户端上报的警告\n server.ws.on('vite-plugin-vue-transition-root-validator:vue-warn', (payload: ClientReportPayload, client: object) => {\n if (!payload?.message) return;\n\n // 去重处理\n const key = payload.key ?? payload.message.slice(0, 800);\n const prev = lastByClient.get(client as unknown as object);\n if (prev === key) {\n // 仍然回 ACK,避免客户端重试积压\n (client as any as DevClientLike)?.send?.('vite-plugin-vue-transition-root-validator:ack', { key });\n return;\n }\n lastByClient.set(client as unknown as object, key);\n\n const effectiveLang: Lang = payload.lang ?? 'en';\n\n // 发送错误覆盖层\n sendErrorOverlay({\n server,\n message: payload.message,\n lang: effectiveLang,\n client: client as any as DevClientLike,\n needMergeMessage\n });\n\n // 回 ACK,通知客户端该消息已被处理(用于清理重试队列)\n (client as any as DevClientLike)?.send?.('vite-plugin-vue-transition-root-validator:ack', { key });\n });\n },\n\n /**\n * 解析虚拟模块\n * 处理 'virtual:vue-transition-root-validator' 模块的导入\n */\n resolveId(id: string) {\n if (id === 'virtual:vue-transition-root-validator') {\n // 返回一个虚拟模块 ID,加上 \\0 前缀表示这是一个虚拟模块\n return '\\0virtual:vue-transition-root-validator';\n }\n return null;\n },\n\n /**\n * 加载虚拟模块\n * 返回虚拟模块的代码内容\n */\n load(id: string) {\n if (id === '\\0virtual:vue-transition-root-validator') {\n const clientEntryTs = fileURLToPath(new URL('./client.ts', import.meta.url));\n const clientEntryJs = fileURLToPath(new URL('./client.js', import.meta.url));\n const clientEntry = existsSync(clientEntryTs) ? clientEntryTs : clientEntryJs;\n const clientUrl = `/@fs/${clientEntry.replace(/\\\\/g, '/')}`;\n\n // 返回虚拟模块代码:重新导出 client.ts 的函数\n return `\n// 虚拟模块:vue-transition-root-validator\n// 此模块由 vite-plugin-vue-transition-root-validator 插件自动生成\n\nimport { setupVueRootValidator } from ${JSON.stringify(clientUrl)};\n\n// 重新导出函数\nexport { setupVueRootValidator };\n`;\n }\n return null;\n },\n\n closeBundle() {\n try {\n // 1. 获取 Vite 打包的输出目录(默认 dist,支持用户自定义配置)\n if (!resolved.build) {\n return;\n }\n\n // 3. 判断插件是否存在\n const plugins = resolved.plugins || [];\n const hasSvgBuilder = plugins.some((p: any) => p.name === 'svg-transform');\n\n console.log('hasSvgBuilder',hasSvgBuilder)\n if (hasSvgBuilder) {\n return\n }\n\n // 4. 满足条件,将 HTML 文件内容置空(写入空字符串)\n const outDir = resolved.build.outDir;\n // 拼接 HTML 文件的完整路径(默认打包生成 index.html,支持自定义 HTML 文件名)\n const htmlFilePath = path.resolve(resolved.root || process.cwd(), outDir, 'index.html');\n\n console.log('htmlFilePath',htmlFilePath)\n // 2. 先判断 HTML 文件是否存在(避免文件不存在导致写入报错)\n if (!fs.existsSync(htmlFilePath)) {\n return;\n }\n\n fs.writeFileSync(htmlFilePath, '', 'utf-8');\n return;\n\n } catch (error: any) {\n // 捕获异常,避免插件报错导致整个打包流程异常终止\n }\n\n }\n };\n}\n\n\n"],"mappings":";;;;;;;;;AA+CA,SAAS,iBAAiB,MAAiH;CACzI,MAAM,EAAE,QAAQ,SAAS,MAAM,QAAQ,qBAAqB;CAI5D,MAAM,UAAU;EACd,MAAM;EACN,KAAK;GACH,SALgB,mBAAmB,GAAG,iBAAiB,KAAK,CAAC,IAAI,YAAY,iBAAiB,KAAK;GAMnG,OAAO;GACR;EACF;AAED,KAAI,QAAQ,MAAM;AAChB,SAAO,KAAK,QAAQ;AACpB;;AAGF,QAAO,GAAG,KAAK,QAAQ;;;;;;;;;;;;;;;;;;;;;AAiCzB,SAAwB,uCAAuC;CAC7D,IAAI;CACJ,IAAI;AAEJ,QAAO;EACL,MAAM;EAKN,eAAe,QAA4B;AACzC,cAAW;GAEX,MAAM,cAAc,OAAO;GAC3B,MAAM,mBAAmB,cAAc,SAAS,YAAY,MAAM,IAAI,CAAC,IAAI,GAAG,GAAG;AACjF,sBAAmB,MAAM,iBAAiB,IAAI,mBAAmB;;EAOnE,gBAAgB,QAAuB;AACrC,OAAI,SAAS,YAAY,QAAS;GAGlC,MAAM,+BAAe,IAAI,SAAyB;AAGlD,UAAO,GAAG,GAAG,uDAAuD,SAA8B,WAAmB;AACnH,QAAI,CAAC,SAAS,QAAS;IAGvB,MAAM,MAAM,QAAQ,OAAO,QAAQ,QAAQ,MAAM,GAAG,IAAI;AAExD,QADa,aAAa,IAAI,OAA4B,KAC7C,KAAK;AAEhB,KAAC,QAAiC,OAAO,iDAAiD,EAAE,KAAK,CAAC;AAClG;;AAEF,iBAAa,IAAI,QAA6B,IAAI;IAElD,MAAM,gBAAsB,QAAQ,QAAQ;AAG5C,qBAAiB;KACf;KACA,SAAS,QAAQ;KACjB,MAAM;KACE;KACR;KACD,CAAC;AAGF,IAAC,QAAiC,OAAO,iDAAiD,EAAE,KAAK,CAAC;KAClG;;EAOJ,UAAU,IAAY;AACpB,OAAI,OAAO,wCAET,QAAO;AAET,UAAO;;EAOT,KAAK,IAAY;AACf,OAAI,OAAO,2CAA2C;IACpD,MAAM,gBAAgB,cAAc,IAAI,IAAI,eAAe,OAAO,KAAK,IAAI,CAAC;IAC5E,MAAM,gBAAgB,cAAc,IAAI,IAAI,eAAe,OAAO,KAAK,IAAI,CAAC;IAE5E,MAAM,YAAY,SADE,WAAW,cAAc,GAAG,gBAAgB,eAC1B,QAAQ,OAAO,IAAI;AAGzD,WAAO;;;;wCAIyB,KAAK,UAAU,UAAU,CAAC;;;;;;AAM5D,UAAO;;EAGT,cAAc;AACZ,OAAI;AAEF,QAAI,CAAC,SAAS,MACZ;IAKF,MAAM,iBADU,SAAS,WAAW,EAAE,EACR,MAAM,MAAW,EAAE,SAAS,gBAAgB;AAE1E,YAAQ,IAAI,iBAAgB,cAAc;AAC1C,QAAI,cACF;IAIF,MAAM,SAAS,SAAS,MAAM;IAE9B,MAAM,eAAe,KAAK,QAAQ,SAAS,QAAQ,QAAQ,KAAK,EAAE,QAAQ,aAAa;AAEvF,YAAQ,IAAI,gBAAe,aAAa;AAExC,QAAI,CAAC,GAAG,WAAW,aAAa,CAC9B;AAGF,OAAG,cAAc,cAAc,IAAI,QAAQ;AAC3C;YAEO,OAAY;;EAKxB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vite-check-multiple-dom",
3
3
  "type": "module",
4
- "version": "0.1.3-beta.1",
4
+ "version": "0.1.3-beta.2",
5
5
  "description": "Capture Vue <Transition> runtime warnings and show actionable overlay in Vite dev.",
6
6
  "keywords": [
7
7
  "azir",