@meng-xi/vite-plugin 0.1.5 → 0.1.7

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.
Files changed (71) hide show
  1. package/README-en.md +33 -15
  2. package/README.md +33 -15
  3. package/dist/common/format/index.cjs +1 -1
  4. package/dist/common/format/index.d.cts +35 -1
  5. package/dist/common/format/index.d.mts +35 -1
  6. package/dist/common/format/index.d.ts +35 -1
  7. package/dist/common/format/index.mjs +1 -1
  8. package/dist/common/fs/index.cjs +1 -1
  9. package/dist/common/fs/index.d.cts +36 -1
  10. package/dist/common/fs/index.d.mts +36 -1
  11. package/dist/common/fs/index.d.ts +36 -1
  12. package/dist/common/fs/index.mjs +1 -1
  13. package/dist/common/html/index.cjs +2 -2
  14. package/dist/common/html/index.d.cts +17 -1
  15. package/dist/common/html/index.d.mts +17 -1
  16. package/dist/common/html/index.d.ts +17 -1
  17. package/dist/common/html/index.mjs +2 -2
  18. package/dist/common/index.cjs +1 -1
  19. package/dist/common/index.d.cts +4 -3
  20. package/dist/common/index.d.mts +4 -3
  21. package/dist/common/index.d.ts +4 -3
  22. package/dist/common/index.mjs +1 -1
  23. package/dist/common/path/index.cjs +1 -0
  24. package/dist/common/path/index.d.cts +103 -0
  25. package/dist/common/path/index.d.mts +103 -0
  26. package/dist/common/path/index.d.ts +103 -0
  27. package/dist/common/path/index.mjs +1 -0
  28. package/dist/index.cjs +1 -1
  29. package/dist/index.d.cts +5 -3
  30. package/dist/index.d.mts +5 -3
  31. package/dist/index.d.ts +5 -3
  32. package/dist/index.mjs +1 -1
  33. package/dist/plugins/assetManifest/index.cjs +1 -0
  34. package/dist/plugins/assetManifest/index.d.cts +162 -0
  35. package/dist/plugins/assetManifest/index.d.mts +162 -0
  36. package/dist/plugins/assetManifest/index.d.ts +162 -0
  37. package/dist/plugins/assetManifest/index.mjs +1 -0
  38. package/dist/plugins/autoImport/index.cjs +7 -5
  39. package/dist/plugins/autoImport/index.mjs +9 -7
  40. package/dist/plugins/buildProgress/index.cjs +2 -2
  41. package/dist/plugins/bundleAnalyzer/index.cjs +21 -21
  42. package/dist/plugins/bundleAnalyzer/index.mjs +2 -2
  43. package/dist/plugins/compressAssets/index.cjs +1 -1
  44. package/dist/plugins/compressAssets/index.mjs +1 -1
  45. package/dist/plugins/envGuard/index.cjs +9 -9
  46. package/dist/plugins/envGuard/index.mjs +7 -7
  47. package/dist/plugins/faviconManager/index.cjs +1 -1
  48. package/dist/plugins/faviconManager/index.mjs +1 -1
  49. package/dist/plugins/generateRouter/index.cjs +5 -4
  50. package/dist/plugins/generateRouter/index.d.cts +33 -0
  51. package/dist/plugins/generateRouter/index.d.mts +33 -0
  52. package/dist/plugins/generateRouter/index.d.ts +33 -0
  53. package/dist/plugins/generateRouter/index.mjs +3 -2
  54. package/dist/plugins/generateVersion/index.cjs +1 -1
  55. package/dist/plugins/generateVersion/index.mjs +1 -1
  56. package/dist/plugins/htmlInject/index.cjs +7 -7
  57. package/dist/plugins/htmlInject/index.mjs +2 -2
  58. package/dist/plugins/index.cjs +1 -1
  59. package/dist/plugins/index.d.cts +1 -0
  60. package/dist/plugins/index.d.mts +1 -0
  61. package/dist/plugins/index.d.ts +1 -0
  62. package/dist/plugins/index.mjs +1 -1
  63. package/dist/plugins/loadingManager/index.cjs +5 -5
  64. package/dist/plugins/loadingManager/index.mjs +4 -4
  65. package/dist/plugins/versionUpdateChecker/index.cjs +4 -4
  66. package/dist/plugins/versionUpdateChecker/index.mjs +4 -4
  67. package/dist/shared/vite-plugin.CcvHfrL8.cjs +1 -0
  68. package/dist/shared/vite-plugin.CuXEJAWX.mjs +1 -0
  69. package/package.json +12 -2
  70. package/dist/shared/vite-plugin.BPFqtmWa.mjs +0 -1
  71. package/dist/shared/vite-plugin.CnOy46d3.cjs +0 -1
@@ -1,11 +1,11 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),common_html_index=require("../../common/html/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),common_format_index=require("../../common/format/index.cjs"),i=require("node:path"),p=require("node:fs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("../../shared/vite-plugin.CnOy46d3.cjs"),require("fs"),require("path");function _interopDefaultCompat(t){return t&&typeof t=="object"&&"default"in t?t.default:t}const i__default=_interopDefaultCompat(i),p__default=_interopDefaultCompat(p),g=new Set(["string","url","path","enum","semver",void 0]);function o$1(t,u){switch(u.type){case"number":{if(isNaN(Number(t))||t.trim()==="")return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u6570\u5B57`};break}case"url":{try{new URL(t)}catch{return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5 URL`}}break}case"boolean":{const r=t.toLowerCase();if(!["true","false","1","0","yes","no"].includes(r))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u5E03\u5C14\u503C (true/false/1/0/yes/no)`};break}case"enum":{if(!u.enumValues||u.enumValues.length===0)return{valid:!1,status:"enum_mismatch",message:"enum \u7C7B\u578B\u5FC5\u987B\u6307\u5B9A enumValues"};if(!u.enumValues.includes(t))return{valid:!1,status:"enum_mismatch",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u503C\u4E2D: ${u.enumValues.join(", ")}`};break}case"json":{try{JSON.parse(t)}catch{return{valid:!1,status:"type_error",message:"\u73AF\u5883\u53D8\u91CF\u503C\u4E0D\u662F\u5408\u6CD5 JSON"}}break}case"semver":{if(!/^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(t))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u8BED\u4E49\u5316\u7248\u672C\u53F7 (x.y.z)`};break}case"path":{if(!/^(?:[./\\]|(?:[a-zA-Z]:))/.test(t))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u6587\u4EF6\u8DEF\u5F84`};break}}return{valid:!0,status:"pass",message:""}}function l(t,u){if(u.type!=="number")return{valid:!0,status:"pass",message:""};const r=Number(t);return u.minValue!==void 0&&r<u.minValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5C0F\u4E8E\u6700\u5C0F\u503C ${u.minValue}`}:u.maxValue!==void 0&&r>u.maxValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5927\u4E8E\u6700\u5927\u503C ${u.maxValue}`}:{valid:!0,status:"pass",message:""}}function d(t,u){return g.has(u.type)?u.minLength!==void 0&&t.length<u.minLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${t.length} \u5C0F\u4E8E\u6700\u5C0F\u957F\u5EA6 ${u.minLength}`}:u.maxLength!==void 0&&t.length>u.maxLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${t.length} \u5927\u4E8E\u6700\u5927\u957F\u5EA6 ${u.maxLength}`}:{valid:!0,status:"pass",message:""}:{valid:!0,status:"pass",message:""}}function validateValue(t,u,r){const e={type:"string",required:!0,...r};if(u===void 0||u==="")return e.required!==!1?{key:t,status:"missing",message:e.message||`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${t}`,value:u,rule:e}:{key:t,status:"pass",message:"",value:e.default??u,rule:e};const s=o$1(u,e);if(!s.valid)return{key:t,status:s.status,message:e.message||s.message,value:u,rule:e};const n=l(u,e);if(!n.valid)return{key:t,status:n.status,message:e.message||n.message,value:u,rule:e};const m=d(u,e);if(!m.valid)return{key:t,status:m.status,message:e.message||m.message,value:u,rule:e};if(e.pattern&&!e.pattern.test(u))return{key:t,status:"custom_error",message:e.message||`\u73AF\u5883\u53D8\u91CF ${t} \u4E0D\u5339\u914D\u6B63\u5219: ${e.pattern.source}`,value:u,rule:e};if(e.validator){const a=e.validator(u);if(a!==!0){const h=typeof a=="string"?a:"";return{key:t,status:"custom_error",message:e.message||h||`\u73AF\u5883\u53D8\u91CF ${t} \u81EA\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25`,value:u,rule:e}}}return{key:t,status:"pass",message:"",value:u,rule:e}}function validateEnvironment(t,u){const r=[];for(const[e,s]of Object.entries(u)){const n=t[e];r.push(validateValue(e,n,s))}return r}function generateTemplate(t){const u=new Map,r=[];for(const[s,n]of Object.entries(t)){const m={type:"string",required:!0,...n};if(m.group){const a=u.get(m.group)||[];a.push({key:s,rule:m}),u.set(m.group,a)}else r.push({key:s,rule:m})}const e=[];e.push("# \u73AF\u5883\u53D8\u91CF\u6A21\u677F\u6587\u4EF6"),e.push(`# \u751F\u6210\u65F6\u95F4: ${new Date().toISOString()}`),e.push("# \u7531 @meng-xi/vite-plugin envGuard \u81EA\u52A8\u751F\u6210"),e.push(""),r.length>0&&o(e,"\u901A\u7528\u914D\u7F6E",r);for(const[s,n]of u)o(e,s,n);return e.join(`
2
- `)}function o(t,u,r){t.push("# =============================="),t.push(`# ${u}`),t.push("# =============================="),t.push("");for(const{key:e,rule:s}of r){s.description&&t.push(`# ${s.description}`);const n=[];n.push(`\u7C7B\u578B: ${s.type||"string"}`),n.push(s.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),s.enumValues&&s.enumValues.length>0&&n.push(`\u679A\u4E3E\u503C: ${s.enumValues.join(" | ")}`),s.minValue!==void 0&&n.push(`\u6700\u5C0F\u503C: ${s.minValue}`),s.maxValue!==void 0&&n.push(`\u6700\u5927\u503C: ${s.maxValue}`),s.minLength!==void 0&&n.push(`\u6700\u5C0F\u957F\u5EA6: ${s.minLength}`),s.maxLength!==void 0&&n.push(`\u6700\u5927\u957F\u5EA6: ${s.maxLength}`),s.sensitive&&n.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),t.push(`# [${n.join(" | ")}]`),s.default!==void 0?t.push(`${e}=${s.sensitive?"********":s.default}`):t.push(`${e}=`),t.push("")}}function generateRuntimeGuard(t,u,r,e){const s=[];for(const[c,v]of Object.entries(t))v.required!==!1&&s.push({key:c,rule:{type:"string",required:!0,...v}});if(s.length===0)return"";const n=e.filter(c=>c.status!=="pass"),m=s.map(({key:c,rule:v})=>({key:c,type:v.type||"string",description:v.description||""})),a=JSON.stringify(m,null,2),h=n.map(c=>c.key),F=JSON.stringify(h),A=f(r);return`<script>
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_format_index=require("../../common/format/index.cjs"),common_html_index=require("../../common/html/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),l$1=require("node:path"),u=require("node:fs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("../../shared/vite-plugin.CcvHfrL8.cjs"),require("fs"),require("path");function _interopDefaultCompat(s){return s&&typeof s=="object"&&"default"in s?s.default:s}const l__default=_interopDefaultCompat(l$1),u__default=_interopDefaultCompat(u),g=new Set(["string","url","path","enum","semver",void 0]);function o$1(s,e){switch(e.type){case"number":{if(isNaN(Number(s))||s.trim()==="")return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u6570\u5B57`};break}case"url":{try{new URL(s)}catch{return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5 URL`}}break}case"boolean":{const r=s.toLowerCase();if(!["true","false","1","0","yes","no"].includes(r))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u5E03\u5C14\u503C (true/false/1/0/yes/no)`};break}case"enum":{if(!e.enumValues||e.enumValues.length===0)return{valid:!1,status:"enum_mismatch",message:"enum \u7C7B\u578B\u5FC5\u987B\u6307\u5B9A enumValues"};if(!e.enumValues.includes(s))return{valid:!1,status:"enum_mismatch",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u503C\u4E2D: ${e.enumValues.join(", ")}`};break}case"json":{try{JSON.parse(s)}catch{return{valid:!1,status:"type_error",message:"\u73AF\u5883\u53D8\u91CF\u503C\u4E0D\u662F\u5408\u6CD5 JSON"}}break}case"semver":{if(!/^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(s))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u8BED\u4E49\u5316\u7248\u672C\u53F7 (x.y.z)`};break}case"path":{if(!/^(?:[./\\]|(?:[a-zA-Z]:))/.test(s))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u6587\u4EF6\u8DEF\u5F84`};break}}return{valid:!0,status:"pass",message:""}}function l(s,e){if(e.type!=="number")return{valid:!0,status:"pass",message:""};const r=Number(s);return e.minValue!==void 0&&r<e.minValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5C0F\u4E8E\u6700\u5C0F\u503C ${e.minValue}`}:e.maxValue!==void 0&&r>e.maxValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5927\u4E8E\u6700\u5927\u503C ${e.maxValue}`}:{valid:!0,status:"pass",message:""}}function d(s,e){return g.has(e.type)?e.minLength!==void 0&&s.length<e.minLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${s.length} \u5C0F\u4E8E\u6700\u5C0F\u957F\u5EA6 ${e.minLength}`}:e.maxLength!==void 0&&s.length>e.maxLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${s.length} \u5927\u4E8E\u6700\u5927\u957F\u5EA6 ${e.maxLength}`}:{valid:!0,status:"pass",message:""}:{valid:!0,status:"pass",message:""}}function validateValue(s,e,r){const t={type:"string",required:!0,...r};if(e===void 0||e==="")return t.required!==!1?{key:s,status:"missing",message:t.message||`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${s}`,value:e,rule:t}:{key:s,status:"pass",message:"",value:t.default??e,rule:t};const i=o$1(e,t);if(!i.valid)return{key:s,status:i.status,message:t.message||i.message,value:e,rule:t};const n=l(e,t);if(!n.valid)return{key:s,status:n.status,message:t.message||n.message,value:e,rule:t};const m=d(e,t);if(!m.valid)return{key:s,status:m.status,message:t.message||m.message,value:e,rule:t};if(t.pattern&&!t.pattern.test(e))return{key:s,status:"custom_error",message:t.message||`\u73AF\u5883\u53D8\u91CF ${s} \u4E0D\u5339\u914D\u6B63\u5219: ${t.pattern.source}`,value:e,rule:t};if(t.validator){const a=t.validator(e);if(a!==!0){const h=typeof a=="string"?a:"";return{key:s,status:"custom_error",message:t.message||h||`\u73AF\u5883\u53D8\u91CF ${s} \u81EA\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25`,value:e,rule:t}}}return{key:s,status:"pass",message:"",value:e,rule:t}}function validateEnvironment(s,e){const r=[];for(const[t,i]of Object.entries(e)){const n=s[t];r.push(validateValue(t,n,i))}return r}function generateTemplate(s){const e=new Map,r=[];for(const[i,n]of Object.entries(s)){const m={type:"string",required:!0,...n};if(m.group){const a=e.get(m.group)||[];a.push({key:i,rule:m}),e.set(m.group,a)}else r.push({key:i,rule:m})}const t=[];t.push("# \u73AF\u5883\u53D8\u91CF\u6A21\u677F\u6587\u4EF6"),t.push(`# \u751F\u6210\u65F6\u95F4: ${new Date().toISOString()}`),t.push("# \u7531 @meng-xi/vite-plugin envGuard \u81EA\u52A8\u751F\u6210"),t.push(""),r.length>0&&o(t,"\u901A\u7528\u914D\u7F6E",r);for(const[i,n]of e)o(t,i,n);return t.join(`
2
+ `)}function o(s,e,r){s.push("# =============================="),s.push(`# ${e}`),s.push("# =============================="),s.push("");for(const{key:t,rule:i}of r){i.description&&s.push(`# ${i.description}`);const n=[];n.push(`\u7C7B\u578B: ${i.type||"string"}`),n.push(i.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),i.enumValues&&i.enumValues.length>0&&n.push(`\u679A\u4E3E\u503C: ${i.enumValues.join(" | ")}`),i.minValue!==void 0&&n.push(`\u6700\u5C0F\u503C: ${i.minValue}`),i.maxValue!==void 0&&n.push(`\u6700\u5927\u503C: ${i.maxValue}`),i.minLength!==void 0&&n.push(`\u6700\u5C0F\u957F\u5EA6: ${i.minLength}`),i.maxLength!==void 0&&n.push(`\u6700\u5927\u957F\u5EA6: ${i.maxLength}`),i.sensitive&&n.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),s.push(`# [${n.join(" | ")}]`),i.default!==void 0?s.push(`${t}=${i.sensitive?"********":i.default}`):s.push(`${t}=`),s.push("")}}function generateRuntimeGuard(s,e,r,t){const i=[];for(const[c,p]of Object.entries(s))p.required!==!1&&i.push({key:c,rule:{type:"string",required:!0,...p}});if(i.length===0)return"";const n=t.filter(c=>c.status!=="pass"),m=i.map(({key:c,rule:p})=>({key:c,type:p.type||"string",description:p.description||""})),a=JSON.stringify(m,null,2),h=n.map(c=>c.key),v=JSON.stringify(h),F=f(r);return`<script>
3
3
  ${`
4
4
  (function() {
5
5
  'use strict';
6
- var GUARD_NAME = ${JSON.stringify(u)};
6
+ var GUARD_NAME = ${JSON.stringify(e)};
7
7
  var GUARD_DATA = ${a};
8
- var FAILED_KEYS = ${F};
8
+ var FAILED_KEYS = ${v};
9
9
  var MODE = ${JSON.stringify(r)};
10
10
 
11
11
  var missing = [];
@@ -42,11 +42,11 @@ ${`
42
42
  }
43
43
 
44
44
  if (hasIssues) {
45
- ${A}
45
+ ${F}
46
46
  }
47
47
  })();
48
48
  `.trim()}
49
- <\/script>`}function f(t){switch(t){case"console":return`
49
+ <\/script>`}function f(s){switch(s){case"console":return`
50
50
  var msgs = [];
51
51
  if (missing.length > 0) msgs.push('[EnvGuard] \u7F3A\u5C11\u73AF\u5883\u53D8\u91CF: ' + missing.join(', '));
52
52
  if (invalid.length > 0) msgs.push('[EnvGuard] \u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u5931\u8D25: ' + invalid.join(', '));
@@ -62,6 +62,6 @@ ${`
62
62
  if (missing.length > 0) html += '\u7F3A\u5C11: ' + missing.join(', ') + '<br>';
63
63
  if (invalid.length > 0) html += '\u6821\u9A8C\u5931\u8D25: ' + invalid.join(', ');
64
64
  overlay.innerHTML = html;
65
- document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}function E(t,u){const r=common_format_index.getDateFormatParams(t);let e=u;for(const[s,n]of Object.entries(r))e=e.replace(new RegExp(`\\{${s}\\}`,"g"),n);return e}class y extends factory_index.BasePlugin{validationResults=[];guardResult=null;getDefaultOptions(){return{required:{},failAction:"error",generateTemplate:!0,templateOutput:".env.template",runtimeGuard:!1,runtimeGlobalName:"__ENV_GUARD__",runtimeGuardMode:"console",envFiles:[".env",".env.local",".env.production",".env.development"],autoLoadEnv:!0,reportOutput:!1,validateBeforeBuild:!0,showSummary:!0}}validateOptions(){this.validator.field("failAction").enum(["error","warn","ignore"]).field("generateTemplate").boolean().field("runtimeGuard").boolean().field("runtimeGuardMode").enum(["console","throw","overlay"]).field("autoLoadEnv").boolean().field("reportOutput").custom(u=>u===!1||typeof u=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("validateBeforeBuild").boolean().field("showSummary").boolean().validate()}getPluginName(){return"env-guard"}addPluginHooks(u){this.options.validateBeforeBuild&&(u.configResolved=r=>{this.viteConfig=r,this.runValidation()}),this.options.runtimeGuard&&(u.transformIndexHtml={order:"post",handler:r=>this.safeExecuteSync(()=>this.injectRuntimeGuard(r),"\u6CE8\u5165\u8FD0\u884C\u65F6\u5B88\u536B")||r})}runValidation(){this.options.autoLoadEnv&&this.loadEnvFiles(),this.validationResults=validateEnvironment(process.env,this.options.required),this.guardResult=this.buildResult(),this.options.generateTemplate&&this.writeEnvTemplate(),this.options.reportOutput&&this.writeReport(),this.options.showSummary&&this.logSummary(),this.handleResults()}loadEnvFiles(){if(!this.viteConfig)return;const u=this.viteConfig.root||process.cwd();for(const r of this.options.envFiles){const e=i__default.resolve(u,r);if(p__default.existsSync(e))try{this.parseAndLoadEnvFile(e)}catch{this.logger.warn(`\u52A0\u8F7D .env \u6587\u4EF6\u5931\u8D25: ${e}`)}}}parseAndLoadEnvFile(u){const r=p__default.readFileSync(u,"utf-8").split(`
66
- `);for(const e of r){const s=e.trim();if(!s||s.startsWith("#"))continue;const n=s.indexOf("=");if(n===-1)continue;const m=s.slice(0,n).trim();let a=s.slice(n+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),m.startsWith("VITE_")&&process.env[m]===void 0&&(process.env[m]=a)}}buildResult(){const u=this.validationResults.length,r=this.validationResults.filter(n=>n.status==="pass").length,e=this.validationResults.filter(n=>n.status==="missing").length,s=this.validationResults.filter(n=>n.status!=="pass"&&n.status!=="missing").length;return{timestamp:E(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:u,passed:r,missing:e,invalid:s,results:this.validationResults,allPassed:e===0&&s===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const u=this.validationResults.filter(n=>n.status==="missing").map(n=>n.key),r=this.validationResults.filter(n=>n.status!=="pass"&&n.status!=="missing"),e=[];u.length>0&&e.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${u.join(", ")}`);for(const n of r)e.push(`${n.key}: ${n.message}`);const s=e.join(`
67
- `);switch(this.options.failAction){case"error":throw new Error(s);case"warn":this.logger.warn(s);break}}writeEnvTemplate(){const u=this.viteConfig?.root||process.cwd(),r=i__default.resolve(u,this.options.templateOutput),e=generateTemplate(this.options.required);this.safeExecuteSync(()=>{common_fs_index.writeFileContent(r,e),this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6A21\u677F\u5DF2\u751F\u6210: ${this.options.templateOutput}`)},"\u751F\u6210 .env \u6A21\u677F")}writeReport(){if(!this.guardResult||!this.options.reportOutput)return;const u=this.viteConfig?.build?.outDir||"dist",r=i__default.resolve(u,this.options.reportOutput);this.safeExecuteSync(()=>{const e=JSON.stringify(this.guardResult,(s,n)=>n instanceof RegExp?n.toString():typeof n=="function"?"[Function]":n,2);common_fs_index.writeFileContent(r,e),this.logger.info(`\u6821\u9A8C\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)},"\u751F\u6210\u6821\u9A8C\u62A5\u544A")}logSummary(){if(!this.guardResult)return;const{total:u,passed:r,missing:e,invalid:s,allPassed:n}=this.guardResult;if(n){this.logger.success(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u901A\u8FC7: ${u} \u4E2A\u53D8\u91CF\u5168\u90E8\u5408\u6CD5`);return}this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u7ED3\u679C: \u603B\u8BA1 ${u} | \u901A\u8FC7 ${r} | \u7F3A\u5931 ${e} | \u5931\u8D25 ${s}`);const m=this.validationResults.filter(a=>a.status!=="pass");for(const a of m){const h=a.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${h}] ${a.key}: ${a.message}`)}}injectRuntimeGuard(u){const r=generateRuntimeGuard(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!r)return u;const e=common_html_index.injectBeforeTag(u,"</head>",r);return e.injected?e.html:(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8FD0\u884C\u65F6\u5B88\u536B\u4EE3\u7801\u672A\u80FD\u6CE8\u5165"),u)}getResult(){return this.guardResult}getValidationResults(){return[...this.validationResults]}}const envGuard=factory_index.createPluginFactory(y);exports.envGuard=envGuard;
65
+ document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}class R extends factory_index.BasePlugin{validationResults=[];guardResult=null;getDefaultOptions(){return{required:{},failAction:"error",generateTemplate:!0,templateOutput:".env.template",runtimeGuard:!1,runtimeGlobalName:"__ENV_GUARD__",runtimeGuardMode:"console",envFiles:[".env",".env.local",".env.production",".env.development"],autoLoadEnv:!0,reportOutput:!1,validateBeforeBuild:!0,showSummary:!0}}validateOptions(){this.validator.field("failAction").enum(["error","warn","ignore"]).field("generateTemplate").boolean().field("runtimeGuard").boolean().field("runtimeGuardMode").enum(["console","throw","overlay"]).field("autoLoadEnv").boolean().field("reportOutput").custom(e=>e===!1||typeof e=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("validateBeforeBuild").boolean().field("showSummary").boolean().validate()}getPluginName(){return"env-guard"}addPluginHooks(e){this.options.validateBeforeBuild&&(e.configResolved=r=>{this.viteConfig=r,this.runValidation()}),this.options.runtimeGuard&&(e.transformIndexHtml={order:"post",handler:r=>this.safeExecuteSync(()=>this.injectRuntimeGuard(r),"\u6CE8\u5165\u8FD0\u884C\u65F6\u5B88\u536B")||r})}runValidation(){this.options.autoLoadEnv&&this.loadEnvFiles(),this.validationResults=validateEnvironment(process.env,this.options.required),this.guardResult=this.buildResult(),this.options.generateTemplate&&this.writeEnvTemplate(),this.options.reportOutput&&this.writeReport(),this.options.showSummary&&this.logSummary(),this.handleResults()}loadEnvFiles(){if(!this.viteConfig)return;const e=this.viteConfig.root||process.cwd();for(const r of this.options.envFiles){const t=l__default.resolve(e,r);if(u__default.existsSync(t))try{this.parseAndLoadEnvFile(t)}catch{this.logger.warn(`\u52A0\u8F7D .env \u6587\u4EF6\u5931\u8D25: ${t}`)}}}parseAndLoadEnvFile(e){const r=u__default.readFileSync(e,"utf-8").split(`
66
+ `);for(const t of r){const i=t.trim();if(!i||i.startsWith("#"))continue;const n=i.indexOf("=");if(n===-1)continue;const m=i.slice(0,n).trim();let a=i.slice(n+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),m.startsWith("VITE_")&&process.env[m]===void 0&&(process.env[m]=a)}}buildResult(){const e=this.validationResults.length,r=this.validationResults.filter(n=>n.status==="pass").length,t=this.validationResults.filter(n=>n.status==="missing").length,i=this.validationResults.filter(n=>n.status!=="pass"&&n.status!=="missing").length;return{timestamp:common_format_index.formatDate(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:e,passed:r,missing:t,invalid:i,results:this.validationResults,allPassed:t===0&&i===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const e=this.validationResults.filter(n=>n.status==="missing").map(n=>n.key),r=this.validationResults.filter(n=>n.status!=="pass"&&n.status!=="missing"),t=[];e.length>0&&t.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${e.join(", ")}`);for(const n of r)t.push(`${n.key}: ${n.message}`);const i=t.join(`
67
+ `);switch(this.options.failAction){case"error":throw new Error(i);case"warn":this.logger.warn(i);break}}writeEnvTemplate(){const e=this.viteConfig?.root||process.cwd(),r=l__default.resolve(e,this.options.templateOutput),t=generateTemplate(this.options.required);this.safeExecuteSync(()=>{common_fs_index.writeFileContent(r,t),this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6A21\u677F\u5DF2\u751F\u6210: ${this.options.templateOutput}`)},"\u751F\u6210 .env \u6A21\u677F")}writeReport(){if(!this.guardResult||!this.options.reportOutput)return;const e=this.viteConfig?.build?.outDir||"dist",r=l__default.resolve(e,this.options.reportOutput);this.safeExecuteSync(()=>{const t=JSON.stringify(this.guardResult,(i,n)=>n instanceof RegExp?n.toString():typeof n=="function"?"[Function]":n,2);common_fs_index.writeFileContent(r,t),this.logger.info(`\u6821\u9A8C\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)},"\u751F\u6210\u6821\u9A8C\u62A5\u544A")}logSummary(){if(!this.guardResult)return;const{total:e,passed:r,missing:t,invalid:i,allPassed:n}=this.guardResult;if(n){this.logger.success(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u901A\u8FC7: ${e} \u4E2A\u53D8\u91CF\u5168\u90E8\u5408\u6CD5`);return}this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u7ED3\u679C: \u603B\u8BA1 ${e} | \u901A\u8FC7 ${r} | \u7F3A\u5931 ${t} | \u5931\u8D25 ${i}`);const m=this.validationResults.filter(a=>a.status!=="pass");for(const a of m){const h=a.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${h}] ${a.key}: ${a.message}`)}}injectRuntimeGuard(e){const r=generateRuntimeGuard(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!r)return e;const t=common_html_index.injectBeforeTag(e,"</head>",r);return t.injected?t.html:(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8FD0\u884C\u65F6\u5B88\u536B\u4EE3\u7801\u672A\u80FD\u6CE8\u5165"),e)}getResult(){return this.guardResult}getValidationResults(){return[...this.validationResults]}}const envGuard=factory_index.createPluginFactory(R);exports.envGuard=envGuard;
@@ -1,10 +1,10 @@
1
- import{createPluginFactory as v,BasePlugin as F}from"../../factory/index.mjs";import{injectBeforeTag as E}from"../../common/html/index.mjs";import{writeFileContent as g}from"../../common/fs/index.mjs";import{getDateFormatParams as A}from"../../common/format/index.mjs";import m from"node:path";import p from"node:fs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"../../shared/vite-plugin.BPFqtmWa.mjs";import"fs";import"path";const C=new Set(["string","url","path","enum","semver",void 0]);function D(t,u){switch(u.type){case"number":{if(isNaN(Number(t))||t.trim()==="")return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u6570\u5B57`};break}case"url":{try{new URL(t)}catch{return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5 URL`}}break}case"boolean":{const r=t.toLowerCase();if(!["true","false","1","0","yes","no"].includes(r))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u5E03\u5C14\u503C (true/false/1/0/yes/no)`};break}case"enum":{if(!u.enumValues||u.enumValues.length===0)return{valid:!1,status:"enum_mismatch",message:"enum \u7C7B\u578B\u5FC5\u987B\u6307\u5B9A enumValues"};if(!u.enumValues.includes(t))return{valid:!1,status:"enum_mismatch",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u503C\u4E2D: ${u.enumValues.join(", ")}`};break}case"json":{try{JSON.parse(t)}catch{return{valid:!1,status:"type_error",message:"\u73AF\u5883\u53D8\u91CF\u503C\u4E0D\u662F\u5408\u6CD5 JSON"}}break}case"semver":{if(!/^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(t))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u8BED\u4E49\u5316\u7248\u672C\u53F7 (x.y.z)`};break}case"path":{if(!/^(?:[./\\]|(?:[a-zA-Z]:))/.test(t))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u6587\u4EF6\u8DEF\u5F84`};break}}return{valid:!0,status:"pass",message:""}}function y(t,u){if(u.type!=="number")return{valid:!0,status:"pass",message:""};const r=Number(t);return u.minValue!==void 0&&r<u.minValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5C0F\u4E8E\u6700\u5C0F\u503C ${u.minValue}`}:u.maxValue!==void 0&&r>u.maxValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5927\u4E8E\u6700\u5927\u503C ${u.maxValue}`}:{valid:!0,status:"pass",message:""}}function $(t,u){return C.has(u.type)?u.minLength!==void 0&&t.length<u.minLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${t.length} \u5C0F\u4E8E\u6700\u5C0F\u957F\u5EA6 ${u.minLength}`}:u.maxLength!==void 0&&t.length>u.maxLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${t.length} \u5927\u4E8E\u6700\u5927\u957F\u5EA6 ${u.maxLength}`}:{valid:!0,status:"pass",message:""}:{valid:!0,status:"pass",message:""}}function R(t,u,r){const e={type:"string",required:!0,...r};if(u===void 0||u==="")return e.required!==!1?{key:t,status:"missing",message:e.message||`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${t}`,value:u,rule:e}:{key:t,status:"pass",message:"",value:e.default??u,rule:e};const s=D(u,e);if(!s.valid)return{key:t,status:s.status,message:e.message||s.message,value:u,rule:e};const i=y(u,e);if(!i.valid)return{key:t,status:i.status,message:e.message||i.message,value:u,rule:e};const a=$(u,e);if(!a.valid)return{key:t,status:a.status,message:e.message||a.message,value:u,rule:e};if(e.pattern&&!e.pattern.test(u))return{key:t,status:"custom_error",message:e.message||`\u73AF\u5883\u53D8\u91CF ${t} \u4E0D\u5339\u914D\u6B63\u5219: ${e.pattern.source}`,value:u,rule:e};if(e.validator){const n=e.validator(u);if(n!==!0){const l=typeof n=="string"?n:"";return{key:t,status:"custom_error",message:e.message||l||`\u73AF\u5883\u53D8\u91CF ${t} \u81EA\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25`,value:u,rule:e}}}return{key:t,status:"pass",message:"",value:u,rule:e}}function w(t,u){const r=[];for(const[e,s]of Object.entries(u)){const i=t[e];r.push(R(e,i,s))}return r}function _(t){const u=new Map,r=[];for(const[s,i]of Object.entries(t)){const a={type:"string",required:!0,...i};if(a.group){const n=u.get(a.group)||[];n.push({key:s,rule:a}),u.set(a.group,n)}else r.push({key:s,rule:a})}const e=[];e.push("# \u73AF\u5883\u53D8\u91CF\u6A21\u677F\u6587\u4EF6"),e.push(`# \u751F\u6210\u65F6\u95F4: ${new Date().toISOString()}`),e.push("# \u7531 @meng-xi/vite-plugin envGuard \u81EA\u52A8\u751F\u6210"),e.push(""),r.length>0&&h(e,"\u901A\u7528\u914D\u7F6E",r);for(const[s,i]of u)h(e,s,i);return e.join(`
2
- `)}function h(t,u,r){t.push("# =============================="),t.push(`# ${u}`),t.push("# =============================="),t.push("");for(const{key:e,rule:s}of r){s.description&&t.push(`# ${s.description}`);const i=[];i.push(`\u7C7B\u578B: ${s.type||"string"}`),i.push(s.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),s.enumValues&&s.enumValues.length>0&&i.push(`\u679A\u4E3E\u503C: ${s.enumValues.join(" | ")}`),s.minValue!==void 0&&i.push(`\u6700\u5C0F\u503C: ${s.minValue}`),s.maxValue!==void 0&&i.push(`\u6700\u5927\u503C: ${s.maxValue}`),s.minLength!==void 0&&i.push(`\u6700\u5C0F\u957F\u5EA6: ${s.minLength}`),s.maxLength!==void 0&&i.push(`\u6700\u5927\u957F\u5EA6: ${s.maxLength}`),s.sensitive&&i.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),t.push(`# [${i.join(" | ")}]`),s.default!==void 0?t.push(`${e}=${s.sensitive?"********":s.default}`):t.push(`${e}=`),t.push("")}}function b(t,u,r,e){const s=[];for(const[o,d]of Object.entries(t))d.required!==!1&&s.push({key:o,rule:{type:"string",required:!0,...d}});if(s.length===0)return"";const i=e.filter(o=>o.status!=="pass"),a=s.map(({key:o,rule:d})=>({key:o,type:d.type||"string",description:d.description||""})),n=JSON.stringify(a,null,2),l=i.map(o=>o.key),f=JSON.stringify(l),c=k(r);return`<script>
1
+ import{createPluginFactory as v,BasePlugin as F}from"../../factory/index.mjs";import{formatDate as A}from"../../common/format/index.mjs";import{injectBeforeTag as E}from"../../common/html/index.mjs";import{writeFileContent as g}from"../../common/fs/index.mjs";import m from"node:path";import p from"node:fs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"../../shared/vite-plugin.CuXEJAWX.mjs";import"fs";import"path";const C=new Set(["string","url","path","enum","semver",void 0]);function D(t,u){switch(u.type){case"number":{if(isNaN(Number(t))||t.trim()==="")return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u6570\u5B57`};break}case"url":{try{new URL(t)}catch{return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5 URL`}}break}case"boolean":{const r=t.toLowerCase();if(!["true","false","1","0","yes","no"].includes(r))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u5E03\u5C14\u503C (true/false/1/0/yes/no)`};break}case"enum":{if(!u.enumValues||u.enumValues.length===0)return{valid:!1,status:"enum_mismatch",message:"enum \u7C7B\u578B\u5FC5\u987B\u6307\u5B9A enumValues"};if(!u.enumValues.includes(t))return{valid:!1,status:"enum_mismatch",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u503C\u4E2D: ${u.enumValues.join(", ")}`};break}case"json":{try{JSON.parse(t)}catch{return{valid:!1,status:"type_error",message:"\u73AF\u5883\u53D8\u91CF\u503C\u4E0D\u662F\u5408\u6CD5 JSON"}}break}case"semver":{if(!/^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(t))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u8BED\u4E49\u5316\u7248\u672C\u53F7 (x.y.z)`};break}case"path":{if(!/^(?:[./\\]|(?:[a-zA-Z]:))/.test(t))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u6587\u4EF6\u8DEF\u5F84`};break}}return{valid:!0,status:"pass",message:""}}function y(t,u){if(u.type!=="number")return{valid:!0,status:"pass",message:""};const r=Number(t);return u.minValue!==void 0&&r<u.minValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5C0F\u4E8E\u6700\u5C0F\u503C ${u.minValue}`}:u.maxValue!==void 0&&r>u.maxValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5927\u4E8E\u6700\u5927\u503C ${u.maxValue}`}:{valid:!0,status:"pass",message:""}}function $(t,u){return C.has(u.type)?u.minLength!==void 0&&t.length<u.minLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${t.length} \u5C0F\u4E8E\u6700\u5C0F\u957F\u5EA6 ${u.minLength}`}:u.maxLength!==void 0&&t.length>u.maxLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${t.length} \u5927\u4E8E\u6700\u5927\u957F\u5EA6 ${u.maxLength}`}:{valid:!0,status:"pass",message:""}:{valid:!0,status:"pass",message:""}}function R(t,u,r){const e={type:"string",required:!0,...r};if(u===void 0||u==="")return e.required!==!1?{key:t,status:"missing",message:e.message||`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${t}`,value:u,rule:e}:{key:t,status:"pass",message:"",value:e.default??u,rule:e};const s=D(u,e);if(!s.valid)return{key:t,status:s.status,message:e.message||s.message,value:u,rule:e};const i=y(u,e);if(!i.valid)return{key:t,status:i.status,message:e.message||i.message,value:u,rule:e};const n=$(u,e);if(!n.valid)return{key:t,status:n.status,message:e.message||n.message,value:u,rule:e};if(e.pattern&&!e.pattern.test(u))return{key:t,status:"custom_error",message:e.message||`\u73AF\u5883\u53D8\u91CF ${t} \u4E0D\u5339\u914D\u6B63\u5219: ${e.pattern.source}`,value:u,rule:e};if(e.validator){const a=e.validator(u);if(a!==!0){const l=typeof a=="string"?a:"";return{key:t,status:"custom_error",message:e.message||l||`\u73AF\u5883\u53D8\u91CF ${t} \u81EA\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25`,value:u,rule:e}}}return{key:t,status:"pass",message:"",value:u,rule:e}}function w(t,u){const r=[];for(const[e,s]of Object.entries(u)){const i=t[e];r.push(R(e,i,s))}return r}function _(t){const u=new Map,r=[];for(const[s,i]of Object.entries(t)){const n={type:"string",required:!0,...i};if(n.group){const a=u.get(n.group)||[];a.push({key:s,rule:n}),u.set(n.group,a)}else r.push({key:s,rule:n})}const e=[];e.push("# \u73AF\u5883\u53D8\u91CF\u6A21\u677F\u6587\u4EF6"),e.push(`# \u751F\u6210\u65F6\u95F4: ${new Date().toISOString()}`),e.push("# \u7531 @meng-xi/vite-plugin envGuard \u81EA\u52A8\u751F\u6210"),e.push(""),r.length>0&&h(e,"\u901A\u7528\u914D\u7F6E",r);for(const[s,i]of u)h(e,s,i);return e.join(`
2
+ `)}function h(t,u,r){t.push("# =============================="),t.push(`# ${u}`),t.push("# =============================="),t.push("");for(const{key:e,rule:s}of r){s.description&&t.push(`# ${s.description}`);const i=[];i.push(`\u7C7B\u578B: ${s.type||"string"}`),i.push(s.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),s.enumValues&&s.enumValues.length>0&&i.push(`\u679A\u4E3E\u503C: ${s.enumValues.join(" | ")}`),s.minValue!==void 0&&i.push(`\u6700\u5C0F\u503C: ${s.minValue}`),s.maxValue!==void 0&&i.push(`\u6700\u5927\u503C: ${s.maxValue}`),s.minLength!==void 0&&i.push(`\u6700\u5C0F\u957F\u5EA6: ${s.minLength}`),s.maxLength!==void 0&&i.push(`\u6700\u5927\u957F\u5EA6: ${s.maxLength}`),s.sensitive&&i.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),t.push(`# [${i.join(" | ")}]`),s.default!==void 0?t.push(`${e}=${s.sensitive?"********":s.default}`):t.push(`${e}=`),t.push("")}}function k(t,u,r,e){const s=[];for(const[o,d]of Object.entries(t))d.required!==!1&&s.push({key:o,rule:{type:"string",required:!0,...d}});if(s.length===0)return"";const i=e.filter(o=>o.status!=="pass"),n=s.map(({key:o,rule:d})=>({key:o,type:d.type||"string",description:d.description||""})),a=JSON.stringify(n,null,2),l=i.map(o=>o.key),f=JSON.stringify(l),c=B(r);return`<script>
3
3
  ${`
4
4
  (function() {
5
5
  'use strict';
6
6
  var GUARD_NAME = ${JSON.stringify(u)};
7
- var GUARD_DATA = ${n};
7
+ var GUARD_DATA = ${a};
8
8
  var FAILED_KEYS = ${f};
9
9
  var MODE = ${JSON.stringify(r)};
10
10
 
@@ -46,7 +46,7 @@ ${`
46
46
  }
47
47
  })();
48
48
  `.trim()}
49
- <\/script>`}function k(t){switch(t){case"console":return`
49
+ <\/script>`}function B(t){switch(t){case"console":return`
50
50
  var msgs = [];
51
51
  if (missing.length > 0) msgs.push('[EnvGuard] \u7F3A\u5C11\u73AF\u5883\u53D8\u91CF: ' + missing.join(', '));
52
52
  if (invalid.length > 0) msgs.push('[EnvGuard] \u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u5931\u8D25: ' + invalid.join(', '));
@@ -62,6 +62,6 @@ ${`
62
62
  if (missing.length > 0) html += '\u7F3A\u5C11: ' + missing.join(', ') + '<br>';
63
63
  if (invalid.length > 0) html += '\u6821\u9A8C\u5931\u8D25: ' + invalid.join(', ');
64
64
  overlay.innerHTML = html;
65
- document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}function B(t,u){const r=A(t);let e=u;for(const[s,i]of Object.entries(r))e=e.replace(new RegExp(`\\{${s}\\}`,"g"),i);return e}class x extends F{validationResults=[];guardResult=null;getDefaultOptions(){return{required:{},failAction:"error",generateTemplate:!0,templateOutput:".env.template",runtimeGuard:!1,runtimeGlobalName:"__ENV_GUARD__",runtimeGuardMode:"console",envFiles:[".env",".env.local",".env.production",".env.development"],autoLoadEnv:!0,reportOutput:!1,validateBeforeBuild:!0,showSummary:!0}}validateOptions(){this.validator.field("failAction").enum(["error","warn","ignore"]).field("generateTemplate").boolean().field("runtimeGuard").boolean().field("runtimeGuardMode").enum(["console","throw","overlay"]).field("autoLoadEnv").boolean().field("reportOutput").custom(u=>u===!1||typeof u=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("validateBeforeBuild").boolean().field("showSummary").boolean().validate()}getPluginName(){return"env-guard"}addPluginHooks(u){this.options.validateBeforeBuild&&(u.configResolved=r=>{this.viteConfig=r,this.runValidation()}),this.options.runtimeGuard&&(u.transformIndexHtml={order:"post",handler:r=>this.safeExecuteSync(()=>this.injectRuntimeGuard(r),"\u6CE8\u5165\u8FD0\u884C\u65F6\u5B88\u536B")||r})}runValidation(){this.options.autoLoadEnv&&this.loadEnvFiles(),this.validationResults=w(process.env,this.options.required),this.guardResult=this.buildResult(),this.options.generateTemplate&&this.writeEnvTemplate(),this.options.reportOutput&&this.writeReport(),this.options.showSummary&&this.logSummary(),this.handleResults()}loadEnvFiles(){if(!this.viteConfig)return;const u=this.viteConfig.root||process.cwd();for(const r of this.options.envFiles){const e=m.resolve(u,r);if(p.existsSync(e))try{this.parseAndLoadEnvFile(e)}catch{this.logger.warn(`\u52A0\u8F7D .env \u6587\u4EF6\u5931\u8D25: ${e}`)}}}parseAndLoadEnvFile(u){const r=p.readFileSync(u,"utf-8").split(`
66
- `);for(const e of r){const s=e.trim();if(!s||s.startsWith("#"))continue;const i=s.indexOf("=");if(i===-1)continue;const a=s.slice(0,i).trim();let n=s.slice(i+1).trim();(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1)),a.startsWith("VITE_")&&process.env[a]===void 0&&(process.env[a]=n)}}buildResult(){const u=this.validationResults.length,r=this.validationResults.filter(i=>i.status==="pass").length,e=this.validationResults.filter(i=>i.status==="missing").length,s=this.validationResults.filter(i=>i.status!=="pass"&&i.status!=="missing").length;return{timestamp:B(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:u,passed:r,missing:e,invalid:s,results:this.validationResults,allPassed:e===0&&s===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const u=this.validationResults.filter(i=>i.status==="missing").map(i=>i.key),r=this.validationResults.filter(i=>i.status!=="pass"&&i.status!=="missing"),e=[];u.length>0&&e.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${u.join(", ")}`);for(const i of r)e.push(`${i.key}: ${i.message}`);const s=e.join(`
67
- `);switch(this.options.failAction){case"error":throw new Error(s);case"warn":this.logger.warn(s);break}}writeEnvTemplate(){const u=this.viteConfig?.root||process.cwd(),r=m.resolve(u,this.options.templateOutput),e=_(this.options.required);this.safeExecuteSync(()=>{g(r,e),this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6A21\u677F\u5DF2\u751F\u6210: ${this.options.templateOutput}`)},"\u751F\u6210 .env \u6A21\u677F")}writeReport(){if(!this.guardResult||!this.options.reportOutput)return;const u=this.viteConfig?.build?.outDir||"dist",r=m.resolve(u,this.options.reportOutput);this.safeExecuteSync(()=>{const e=JSON.stringify(this.guardResult,(s,i)=>i instanceof RegExp?i.toString():typeof i=="function"?"[Function]":i,2);g(r,e),this.logger.info(`\u6821\u9A8C\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)},"\u751F\u6210\u6821\u9A8C\u62A5\u544A")}logSummary(){if(!this.guardResult)return;const{total:u,passed:r,missing:e,invalid:s,allPassed:i}=this.guardResult;if(i){this.logger.success(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u901A\u8FC7: ${u} \u4E2A\u53D8\u91CF\u5168\u90E8\u5408\u6CD5`);return}this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u7ED3\u679C: \u603B\u8BA1 ${u} | \u901A\u8FC7 ${r} | \u7F3A\u5931 ${e} | \u5931\u8D25 ${s}`);const a=this.validationResults.filter(n=>n.status!=="pass");for(const n of a){const l=n.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${l}] ${n.key}: ${n.message}`)}}injectRuntimeGuard(u){const r=b(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!r)return u;const e=E(u,"</head>",r);return e.injected?e.html:(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8FD0\u884C\u65F6\u5B88\u536B\u4EE3\u7801\u672A\u80FD\u6CE8\u5165"),u)}getResult(){return this.guardResult}getValidationResults(){return[...this.validationResults]}}const O=v(x);export{O as envGuard};
65
+ document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}class b extends F{validationResults=[];guardResult=null;getDefaultOptions(){return{required:{},failAction:"error",generateTemplate:!0,templateOutput:".env.template",runtimeGuard:!1,runtimeGlobalName:"__ENV_GUARD__",runtimeGuardMode:"console",envFiles:[".env",".env.local",".env.production",".env.development"],autoLoadEnv:!0,reportOutput:!1,validateBeforeBuild:!0,showSummary:!0}}validateOptions(){this.validator.field("failAction").enum(["error","warn","ignore"]).field("generateTemplate").boolean().field("runtimeGuard").boolean().field("runtimeGuardMode").enum(["console","throw","overlay"]).field("autoLoadEnv").boolean().field("reportOutput").custom(u=>u===!1||typeof u=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("validateBeforeBuild").boolean().field("showSummary").boolean().validate()}getPluginName(){return"env-guard"}addPluginHooks(u){this.options.validateBeforeBuild&&(u.configResolved=r=>{this.viteConfig=r,this.runValidation()}),this.options.runtimeGuard&&(u.transformIndexHtml={order:"post",handler:r=>this.safeExecuteSync(()=>this.injectRuntimeGuard(r),"\u6CE8\u5165\u8FD0\u884C\u65F6\u5B88\u536B")||r})}runValidation(){this.options.autoLoadEnv&&this.loadEnvFiles(),this.validationResults=w(process.env,this.options.required),this.guardResult=this.buildResult(),this.options.generateTemplate&&this.writeEnvTemplate(),this.options.reportOutput&&this.writeReport(),this.options.showSummary&&this.logSummary(),this.handleResults()}loadEnvFiles(){if(!this.viteConfig)return;const u=this.viteConfig.root||process.cwd();for(const r of this.options.envFiles){const e=m.resolve(u,r);if(p.existsSync(e))try{this.parseAndLoadEnvFile(e)}catch{this.logger.warn(`\u52A0\u8F7D .env \u6587\u4EF6\u5931\u8D25: ${e}`)}}}parseAndLoadEnvFile(u){const r=p.readFileSync(u,"utf-8").split(`
66
+ `);for(const e of r){const s=e.trim();if(!s||s.startsWith("#"))continue;const i=s.indexOf("=");if(i===-1)continue;const n=s.slice(0,i).trim();let a=s.slice(i+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),n.startsWith("VITE_")&&process.env[n]===void 0&&(process.env[n]=a)}}buildResult(){const u=this.validationResults.length,r=this.validationResults.filter(i=>i.status==="pass").length,e=this.validationResults.filter(i=>i.status==="missing").length,s=this.validationResults.filter(i=>i.status!=="pass"&&i.status!=="missing").length;return{timestamp:A(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:u,passed:r,missing:e,invalid:s,results:this.validationResults,allPassed:e===0&&s===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const u=this.validationResults.filter(i=>i.status==="missing").map(i=>i.key),r=this.validationResults.filter(i=>i.status!=="pass"&&i.status!=="missing"),e=[];u.length>0&&e.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${u.join(", ")}`);for(const i of r)e.push(`${i.key}: ${i.message}`);const s=e.join(`
67
+ `);switch(this.options.failAction){case"error":throw new Error(s);case"warn":this.logger.warn(s);break}}writeEnvTemplate(){const u=this.viteConfig?.root||process.cwd(),r=m.resolve(u,this.options.templateOutput),e=_(this.options.required);this.safeExecuteSync(()=>{g(r,e),this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6A21\u677F\u5DF2\u751F\u6210: ${this.options.templateOutput}`)},"\u751F\u6210 .env \u6A21\u677F")}writeReport(){if(!this.guardResult||!this.options.reportOutput)return;const u=this.viteConfig?.build?.outDir||"dist",r=m.resolve(u,this.options.reportOutput);this.safeExecuteSync(()=>{const e=JSON.stringify(this.guardResult,(s,i)=>i instanceof RegExp?i.toString():typeof i=="function"?"[Function]":i,2);g(r,e),this.logger.info(`\u6821\u9A8C\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)},"\u751F\u6210\u6821\u9A8C\u62A5\u544A")}logSummary(){if(!this.guardResult)return;const{total:u,passed:r,missing:e,invalid:s,allPassed:i}=this.guardResult;if(i){this.logger.success(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u901A\u8FC7: ${u} \u4E2A\u53D8\u91CF\u5168\u90E8\u5408\u6CD5`);return}this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u7ED3\u679C: \u603B\u8BA1 ${u} | \u901A\u8FC7 ${r} | \u7F3A\u5931 ${e} | \u5931\u8D25 ${s}`);const n=this.validationResults.filter(a=>a.status!=="pass");for(const a of n){const l=a.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${l}] ${a.key}: ${a.message}`)}}injectRuntimeGuard(u){const r=k(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!r)return u;const e=E(u,"</head>",r);return e.injected?e.html:(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8FD0\u884C\u65F6\u5B88\u536B\u4EE3\u7801\u672A\u80FD\u6CE8\u5165"),u)}getResult(){return this.guardResult}getValidationResults(){return[...this.validationResults]}}const x=v(b);export{x as envGuard};
@@ -1 +1 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),validator=require("../../shared/vite-plugin.Bcg6RW2N.cjs"),common_html_index=require("../../common/html/index.cjs");require("../../logger/index.cjs"),require("fs"),require("path"),require("../../shared/vite-plugin.CnOy46d3.cjs");function generateIconTagDescriptors(u){const i=[];if(u.link)return[];if(u.icons&&u.icons.length>0)for(const e of u.icons){const t={rel:e.rel,href:e.href};e.sizes&&(t.sizes=e.sizes),e.type&&(t.type=e.type),i.push({tag:"link",attrs:t,injectTo:"head"})}else if(u.url)i.push({tag:"link",attrs:{rel:"icon",href:u.url},injectTo:"head"});else{const e=u.base||"/",t=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:t},injectTo:"head"})}return i}class f extends factory_index.BasePlugin{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new validator.Validator(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=generateIconTagDescriptors(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,t=common_html_index.injectBeforeTag(i,"</head>",e);return t.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),t.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:t,overwrite:r=!0,recursive:n=!0}=i;await common_fs_index.checkSourceExists(e);const s=await common_fs_index.copySourceToTarget(e,t,{recursive:n,overwrite:r,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${s.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${s.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${s.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const t=this.getIconTagDescriptors();return t.length>0?{html:e,tags:t}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const faviconManager=factory_index.createPluginFactory(f,u=>typeof u=="string"?{base:u}:u||{});exports.faviconManager=faviconManager;
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),validator=require("../../shared/vite-plugin.Bcg6RW2N.cjs"),common_html_index=require("../../common/html/index.cjs");require("../../logger/index.cjs"),require("fs"),require("path"),require("../../shared/vite-plugin.CcvHfrL8.cjs");function generateIconTagDescriptors(u){const i=[];if(u.link)return[];if(u.icons&&u.icons.length>0)for(const e of u.icons){const t={rel:e.rel,href:e.href};e.sizes&&(t.sizes=e.sizes),e.type&&(t.type=e.type),i.push({tag:"link",attrs:t,injectTo:"head"})}else if(u.url)i.push({tag:"link",attrs:{rel:"icon",href:u.url},injectTo:"head"});else{const e=u.base||"/",t=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:t},injectTo:"head"})}return i}class f extends factory_index.BasePlugin{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new validator.Validator(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=generateIconTagDescriptors(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,t=common_html_index.injectBeforeTag(i,"</head>",e);return t.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),t.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:t,overwrite:r=!0,recursive:n=!0}=i;await common_fs_index.checkSourceExists(e);const s=await common_fs_index.copySourceToTarget(e,t,{recursive:n,overwrite:r,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${s.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${s.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${s.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const t=this.getIconTagDescriptors();return t.length>0?{html:e,tags:t}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const faviconManager=factory_index.createPluginFactory(f,u=>typeof u=="string"?{base:u}:u||{});exports.faviconManager=faviconManager;
@@ -1 +1 @@
1
- import{createPluginFactory as n,BasePlugin as a}from"../../factory/index.mjs";import{checkSourceExists as c,copySourceToTarget as l}from"../../common/fs/index.mjs";import{V as g}from"../../shared/vite-plugin.DcExl6jd.mjs";import{injectBeforeTag as p}from"../../common/html/index.mjs";import"../../logger/index.mjs";import"fs";import"path";import"../../shared/vite-plugin.BPFqtmWa.mjs";function F(u){const i=[];if(u.link)return[];if(u.icons&&u.icons.length>0)for(const e of u.icons){const t={rel:e.rel,href:e.href};e.sizes&&(t.sizes=e.sizes),e.type&&(t.type=e.type),i.push({tag:"link",attrs:t,injectTo:"head"})}else if(u.url)i.push({tag:"link",attrs:{rel:"icon",href:u.url},injectTo:"head"});else{const e=u.base||"/",t=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:t},injectTo:"head"})}return i}class h extends a{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new g(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=F(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,t=p(i,"</head>",e);return t.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),t.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:t,overwrite:s=!0,recursive:o=!0}=i;await c(e);const r=await l(e,t,{recursive:o,overwrite:s,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const t=this.getIconTagDescriptors();return t.length>0?{html:e,tags:t}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const f=n(h,u=>typeof u=="string"?{base:u}:u||{});export{f as faviconManager};
1
+ import{createPluginFactory as n,BasePlugin as a}from"../../factory/index.mjs";import{checkSourceExists as c,copySourceToTarget as l}from"../../common/fs/index.mjs";import{V as g}from"../../shared/vite-plugin.DcExl6jd.mjs";import{injectBeforeTag as p}from"../../common/html/index.mjs";import"../../logger/index.mjs";import"fs";import"path";import"../../shared/vite-plugin.CuXEJAWX.mjs";function F(u){const i=[];if(u.link)return[];if(u.icons&&u.icons.length>0)for(const e of u.icons){const t={rel:e.rel,href:e.href};e.sizes&&(t.sizes=e.sizes),e.type&&(t.type=e.type),i.push({tag:"link",attrs:t,injectTo:"head"})}else if(u.url)i.push({tag:"link",attrs:{rel:"icon",href:u.url},injectTo:"head"});else{const e=u.base||"/",t=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:t},injectTo:"head"})}return i}class h extends a{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new g(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=F(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,t=p(i,"</head>",e);return t.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),t.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:t,overwrite:s=!0,recursive:o=!0}=i;await c(e);const r=await l(e,t,{recursive:o,overwrite:s,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const t=this.getIconTagDescriptors();return t.length>0?{html:e,tags:t}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const f=n(h,u=>typeof u=="string"?{base:u}:u||{});export{f as faviconManager};
@@ -1,4 +1,5 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),m=require("path"),n=require("fs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs");function u(i,e=/[/-]/){return i.replace(/^\/+/,"").split(e).filter(Boolean).map((t,s)=>s===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function R(i,e=/[/-]/){return i.replace(/^\/+/,"").split(e).filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function P(i){return i.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"")}class d extends factory_index.BasePlugin{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"}}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").enum(["ts","js"]).field("nameStrategy").enum(["path","camelCase","pascalCase","custom"]).validate(),this.options.nameStrategy==="custom"&&!this.options.customNameGenerator)throw new Error("\u5F53 nameStrategy \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customNameGenerator")}getPluginName(){return"generate-router"}generateRouteName(e){switch(this.options.nameStrategy){case"path":return e.replace(/\//g,"_").replace(/^_/,"");case"camelCase":return u(e);case"pascalCase":return R(e);case"custom":return this.options.customNameGenerator(e);default:return u(e)}}extractMeta(e,t){const s={},a=e.style||{},r=this.options.metaMapping||{};for(const[o,c]of Object.entries(r))a[o]!==void 0&&(s[c]=a[o]);return this.tabBarPages.has(t)&&(s.isTab=!0),s}parsePageToRoute(e,t=""){const s=t?`/${t}/${e.path}`:`/${e.path}`,a=this.generateRouteName(s),r=this.extractMeta(e,s.replace(/^\//,"")),o={path:s,name:a};return Object.keys(r).length>0&&(o.meta=r),o}parsePagesJson(e){const t=[];if(!e.pages||!Array.isArray(e.pages)||e.pages.length===0)return this.logger.warn("pages.json \u4E2D\u6CA1\u6709\u6709\u6548\u7684\u9875\u9762\u914D\u7F6E"),t;if(this.tabBarPages.clear(),e.tabBar?.list)for(const s of e.tabBar.list)this.tabBarPages.add(s.pagePath);for(const s of e.pages)t.push(this.parsePageToRoute(s));if(this.options.includeSubPackages&&e.subPackages){for(const s of e.subPackages)if(s.pages&&Array.isArray(s.pages))for(const a of s.pages)t.push(this.parsePageToRoute(a,s.root))}return t}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),u$1=require("path"),s$1=require("fs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs");function toCamelCase(i,e=/[/-]/){return i.replace(/^\/+/,"").split(e).filter(Boolean).map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function toPascalCase(i,e=/[/-]/){return i.replace(/^\/+/,"").split(e).filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function stripJsonComments(i){return i.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"")}function s(i,e){return typeof e=="string"?"string":typeof e=="boolean"?e?"true":"false":typeof e=="number"?"number":"unknown"}function u(i){const e=Object.entries(i);return e.length===0?"{}":`{ ${e.map(([t,r])=>`${t}: ${s(t,r)}`).join("; ")} }`}function generateRouterDtsContent(i,e="@meng-xi/uni-router"){const t=[];t.push(`import '${e}'`),t.push(""),t.push(`declare module '${e}' {`),t.push(" interface RouteNameMap {");for(const r of i){const a=r.name||r.path;r.meta?.title&&t.push(` /** ${r.meta.title} */`);const o=r.meta?u(r.meta):"{}";t.push(` ${a}: { path: '${r.path}'; meta: ${o} }`)}return t.push(" }"),t.push("}"),t.join(`
2
+ `)}class y extends factory_index.BasePlugin{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"},dts:!1}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").enum(["ts","js"]).field("nameStrategy").enum(["path","camelCase","pascalCase","custom"]).validate(),this.options.nameStrategy==="custom"&&!this.options.customNameGenerator)throw new Error("\u5F53 nameStrategy \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customNameGenerator")}getPluginName(){return"generate-router"}generateRouteName(e){switch(this.options.nameStrategy){case"path":return e.replace(/\//g,"_").replace(/^_/,"");case"camelCase":return toCamelCase(e);case"pascalCase":return toPascalCase(e);case"custom":return this.options.customNameGenerator(e);default:return toCamelCase(e)}}extractMeta(e,t){const r={},a=e.style||{},o=this.options.metaMapping||{};for(const[n,c]of Object.entries(o))a[n]!==void 0&&(r[c]=a[n]);return this.tabBarPages.has(t)&&(r.isTab=!0),r}parsePageToRoute(e,t=""){const r=t?`/${t}/${e.path}`:`/${e.path}`,a=this.generateRouteName(r),o=this.extractMeta(e,r.replace(/^\//,"")),n={path:r,name:a};return Object.keys(o).length>0&&(n.meta=o),n}parsePagesJson(e){const t=[];if(!e.pages||!Array.isArray(e.pages)||e.pages.length===0)return this.logger.warn("pages.json \u4E2D\u6CA1\u6709\u6709\u6548\u7684\u9875\u9762\u914D\u7F6E"),t;if(this.tabBarPages.clear(),e.tabBar?.list)for(const r of e.tabBar.list)this.tabBarPages.add(r.pagePath);for(const r of e.pages)t.push(this.parsePageToRoute(r));if(this.options.includeSubPackages&&e.subPackages){for(const r of e.subPackages)if(r.pages&&Array.isArray(r.pages))for(const a of r.pages)t.push(this.parsePageToRoute(a,r.root))}return t}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
2
3
  /**
3
4
  * \u8DEF\u7531\u5143\u4FE1\u606F
4
5
  */
@@ -24,12 +25,12 @@ export interface RouteConfig {
24
25
  /** \u8DEF\u7531\u5143\u4FE1\u606F */
25
26
  meta?: RouteMeta
26
27
  }
27
- `}generateFileContent(e){const t=this.generateTypeDefinitions(),s=this.options.outputFormat==="ts",a=JSON.stringify(e,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${t}
28
+ `}generateFileContent(e){const t=this.generateTypeDefinitions(),r=this.options.outputFormat==="ts",a=JSON.stringify(e,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${t}
28
29
  /**
29
30
  * \u8DEF\u7531\u914D\u7F6E\u5217\u8868
30
31
  * @description \u7531 pages.json \u81EA\u52A8\u751F\u6210
31
32
  */
32
- export const routes${s?": RouteConfig[]":""} = ${a}
33
+ export const routes${r?": RouteConfig[]":""} = ${a}
33
34
 
34
35
  export default routes
35
- `}async readPagesJson(){const e=m.resolve(this.projectRoot,this.options.pagesJsonPath);if(!n.existsSync(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const t=await n.promises.readFile(e,"utf-8"),s=P(t);return JSON.parse(s)}catch(t){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${t.message}`),null}}extractExistingRoutes(e){const t=new Map,s=e.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!s)return t;try{let a=s[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const r=JSON.parse(a);for(const o of r)o.path&&t.set(o.path,o)}catch{this.logger.warn("\u89E3\u6790\u73B0\u6709 routes \u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u5B8C\u5168\u91CD\u65B0\u751F\u6210")}return t}mergeRoutes(e,t){return e.map(s=>{const a=t.get(s.path);if(!a)return s;const r={};return s.meta&&Object.assign(r,s.meta),a.meta&&Object.assign(r,a.meta),{...a,path:s.path,meta:Object.keys(r).length>0?r:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let t=this.parsePagesJson(e);const s=m.resolve(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&n.existsSync(s))try{const r=await n.promises.readFile(s,"utf-8"),o=this.extractExistingRoutes(r);o.size>0&&(t=this.mergeRoutes(t,o),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const a=this.generateFileContent(t);await common_fs_index.writeFileContent(s,a),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${s}`),this.logger.info(`\u5171\u751F\u6210 ${t.length} \u6761\u8DEF\u7531\u914D\u7F6E`)}startWatching(){if(!this.options.watch)return;const e=m.resolve(this.projectRoot,this.options.pagesJsonPath);n.existsSync(e)&&(this.watcher=n.watch(e,async t=>{t==="change"&&(this.logger.info("\u68C0\u6D4B\u5230 pages.json \u53D8\u5316\uFF0C\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E..."),await this.safeExecute(()=>this.generateRouterConfig(),"\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E"))}),this.logger.info(`\u6B63\u5728\u76D1\u542C pages.json \u53D8\u5316: ${e}`))}stopWatching(){this.watcher&&(this.watcher.close(),this.watcher=null)}addPluginHooks(e){e.configResolved=async t=>{this.projectRoot=t.root,await this.safeExecute(()=>this.generateRouterConfig(),"\u751F\u6210\u8DEF\u7531\u914D\u7F6E"),t.command==="serve"&&this.startWatching()}}destroy(){super.destroy(),this.stopWatching()}}const generateRouter=factory_index.createPluginFactory(d);exports.generateRouter=generateRouter;
36
+ `}async readPagesJson(){const e=u$1.resolve(this.projectRoot,this.options.pagesJsonPath);if(!s$1.existsSync(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const t=await s$1.promises.readFile(e,"utf-8"),r=stripJsonComments(t);return JSON.parse(r)}catch(t){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${t.message}`),null}}extractExistingRoutes(e){const t=new Map,r=e.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!r)return t;try{let a=r[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const o=JSON.parse(a);for(const n of o)n.path&&t.set(n.path,n)}catch{this.logger.warn("\u89E3\u6790\u73B0\u6709 routes \u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u5B8C\u5168\u91CD\u65B0\u751F\u6210")}return t}mergeRoutes(e,t){return e.map(r=>{const a=t.get(r.path);if(!a)return r;const o={};return r.meta&&Object.assign(o,r.meta),a.meta&&Object.assign(o,a.meta),{...a,path:r.path,meta:Object.keys(o).length>0?o:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let t=this.parsePagesJson(e);const r=u$1.resolve(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&s$1.existsSync(r))try{const o=await s$1.promises.readFile(r,"utf-8"),n=this.extractExistingRoutes(o);n.size>0&&(t=this.mergeRoutes(t,n),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const a=this.generateFileContent(t);await common_fs_index.writeFileContent(r,a),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${r}`),this.logger.info(`\u5171\u751F\u6210 ${t.length} \u6761\u8DEF\u7531\u914D\u7F6E`),await this.generateDtsFile(t)}async generateDtsFile(e){if(!this.options.dts)return;const t=u$1.resolve(this.projectRoot,typeof this.options.dts=="string"?this.options.dts:"src/router.d.ts"),r=generateRouterDtsContent(e);common_fs_index.shouldUpdateFileContent(t,r)&&(await common_fs_index.writeFileContent(t,r),this.logger.success(`\u8DEF\u7531\u7C7B\u578B\u58F0\u660E\u6587\u4EF6\u5DF2\u751F\u6210: ${t}`))}startWatching(){if(!this.options.watch)return;const e=u$1.resolve(this.projectRoot,this.options.pagesJsonPath);s$1.existsSync(e)&&(this.watcher=s$1.watch(e,async t=>{t==="change"&&(this.logger.info("\u68C0\u6D4B\u5230 pages.json \u53D8\u5316\uFF0C\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E..."),await this.safeExecute(()=>this.generateRouterConfig(),"\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E"))}),this.logger.info(`\u6B63\u5728\u76D1\u542C pages.json \u53D8\u5316: ${e}`))}stopWatching(){this.watcher&&(this.watcher.close(),this.watcher=null)}addPluginHooks(e){e.configResolved=async t=>{this.projectRoot=t.root,await this.safeExecute(()=>this.generateRouterConfig(),"\u751F\u6210\u8DEF\u7531\u914D\u7F6E"),t.command==="serve"&&this.startWatching()}}destroy(){super.destroy(),this.stopWatching()}}const generateRouter=factory_index.createPluginFactory(y);exports.generateRouter=generateRouter;
@@ -203,6 +203,29 @@ interface GenerateRouterOptions extends BasePluginOptions {
203
203
  * @default true
204
204
  */
205
205
  preserveRouteChanges?: boolean;
206
+ /**
207
+ * TypeScript 类型声明文件输出路径
208
+ *
209
+ * @description 控制是否生成路由类型声明文件(`.d.ts`):
210
+ * - `string`:在指定路径生成类型声明文件
211
+ * - `true`:使用默认路径 `src/router.d.ts`
212
+ * - `false`:不生成类型声明文件
213
+ *
214
+ * 生成的类型声明文件会为 `@meng-xi/uni-router` 模块扩展 `RouteNameMap` 接口,
215
+ * 提供路由名称到路径和元信息的类型映射,实现类型安全的路由导航。
216
+ *
217
+ * @default false
218
+ *
219
+ * @example
220
+ * ```typescript
221
+ * // 使用默认路径
222
+ * generateRouter({ dts: true })
223
+ *
224
+ * // 自定义路径
225
+ * generateRouter({ dts: 'src/types/router.d.ts' })
226
+ * ```
227
+ */
228
+ dts?: string | boolean;
206
229
  }
207
230
 
208
231
  /**
@@ -246,6 +269,16 @@ interface GenerateRouterOptions extends BasePluginOptions {
246
269
  * customField: 'custom'
247
270
  * }
248
271
  * })
272
+ *
273
+ * // 生成路由类型声明文件
274
+ * generateRouter({
275
+ * dts: true
276
+ * })
277
+ *
278
+ * // 自定义类型声明文件路径
279
+ * generateRouter({
280
+ * dts: 'src/types/router.d.ts'
281
+ * })
249
282
  * ```
250
283
  *
251
284
  * @remarks
@@ -203,6 +203,29 @@ interface GenerateRouterOptions extends BasePluginOptions {
203
203
  * @default true
204
204
  */
205
205
  preserveRouteChanges?: boolean;
206
+ /**
207
+ * TypeScript 类型声明文件输出路径
208
+ *
209
+ * @description 控制是否生成路由类型声明文件(`.d.ts`):
210
+ * - `string`:在指定路径生成类型声明文件
211
+ * - `true`:使用默认路径 `src/router.d.ts`
212
+ * - `false`:不生成类型声明文件
213
+ *
214
+ * 生成的类型声明文件会为 `@meng-xi/uni-router` 模块扩展 `RouteNameMap` 接口,
215
+ * 提供路由名称到路径和元信息的类型映射,实现类型安全的路由导航。
216
+ *
217
+ * @default false
218
+ *
219
+ * @example
220
+ * ```typescript
221
+ * // 使用默认路径
222
+ * generateRouter({ dts: true })
223
+ *
224
+ * // 自定义路径
225
+ * generateRouter({ dts: 'src/types/router.d.ts' })
226
+ * ```
227
+ */
228
+ dts?: string | boolean;
206
229
  }
207
230
 
208
231
  /**
@@ -246,6 +269,16 @@ interface GenerateRouterOptions extends BasePluginOptions {
246
269
  * customField: 'custom'
247
270
  * }
248
271
  * })
272
+ *
273
+ * // 生成路由类型声明文件
274
+ * generateRouter({
275
+ * dts: true
276
+ * })
277
+ *
278
+ * // 自定义类型声明文件路径
279
+ * generateRouter({
280
+ * dts: 'src/types/router.d.ts'
281
+ * })
249
282
  * ```
250
283
  *
251
284
  * @remarks
@@ -203,6 +203,29 @@ interface GenerateRouterOptions extends BasePluginOptions {
203
203
  * @default true
204
204
  */
205
205
  preserveRouteChanges?: boolean;
206
+ /**
207
+ * TypeScript 类型声明文件输出路径
208
+ *
209
+ * @description 控制是否生成路由类型声明文件(`.d.ts`):
210
+ * - `string`:在指定路径生成类型声明文件
211
+ * - `true`:使用默认路径 `src/router.d.ts`
212
+ * - `false`:不生成类型声明文件
213
+ *
214
+ * 生成的类型声明文件会为 `@meng-xi/uni-router` 模块扩展 `RouteNameMap` 接口,
215
+ * 提供路由名称到路径和元信息的类型映射,实现类型安全的路由导航。
216
+ *
217
+ * @default false
218
+ *
219
+ * @example
220
+ * ```typescript
221
+ * // 使用默认路径
222
+ * generateRouter({ dts: true })
223
+ *
224
+ * // 自定义路径
225
+ * generateRouter({ dts: 'src/types/router.d.ts' })
226
+ * ```
227
+ */
228
+ dts?: string | boolean;
206
229
  }
207
230
 
208
231
  /**
@@ -246,6 +269,16 @@ interface GenerateRouterOptions extends BasePluginOptions {
246
269
  * customField: 'custom'
247
270
  * }
248
271
  * })
272
+ *
273
+ * // 生成路由类型声明文件
274
+ * generateRouter({
275
+ * dts: true
276
+ * })
277
+ *
278
+ * // 自定义类型声明文件路径
279
+ * generateRouter({
280
+ * dts: 'src/types/router.d.ts'
281
+ * })
249
282
  * ```
250
283
  *
251
284
  * @remarks
@@ -1,4 +1,5 @@
1
- import{createPluginFactory as h,BasePlugin as l}from"../../factory/index.mjs";import{writeFileContent as F}from"../../common/fs/index.mjs";import{resolve as n}from"path";import{existsSync as i,promises as c,watch as f}from"fs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";function p(o,t=/[/-]/){return o.replace(/^\/+/,"").split(t).filter(Boolean).map((e,u)=>u===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}function m(o,t=/[/-]/){return o.replace(/^\/+/,"").split(t).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}function E(o){return o.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"")}class D extends l{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"}}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").enum(["ts","js"]).field("nameStrategy").enum(["path","camelCase","pascalCase","custom"]).validate(),this.options.nameStrategy==="custom"&&!this.options.customNameGenerator)throw new Error("\u5F53 nameStrategy \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customNameGenerator")}getPluginName(){return"generate-router"}generateRouteName(t){switch(this.options.nameStrategy){case"path":return t.replace(/\//g,"_").replace(/^_/,"");case"camelCase":return p(t);case"pascalCase":return m(t);case"custom":return this.options.customNameGenerator(t);default:return p(t)}}extractMeta(t,e){const u={},s=t.style||{},a=this.options.metaMapping||{};for(const[r,g]of Object.entries(a))s[r]!==void 0&&(u[g]=s[r]);return this.tabBarPages.has(e)&&(u.isTab=!0),u}parsePageToRoute(t,e=""){const u=e?`/${e}/${t.path}`:`/${t.path}`,s=this.generateRouteName(u),a=this.extractMeta(t,u.replace(/^\//,"")),r={path:u,name:s};return Object.keys(a).length>0&&(r.meta=a),r}parsePagesJson(t){const e=[];if(!t.pages||!Array.isArray(t.pages)||t.pages.length===0)return this.logger.warn("pages.json \u4E2D\u6CA1\u6709\u6709\u6548\u7684\u9875\u9762\u914D\u7F6E"),e;if(this.tabBarPages.clear(),t.tabBar?.list)for(const u of t.tabBar.list)this.tabBarPages.add(u.pagePath);for(const u of t.pages)e.push(this.parsePageToRoute(u));if(this.options.includeSubPackages&&t.subPackages){for(const u of t.subPackages)if(u.pages&&Array.isArray(u.pages))for(const s of u.pages)e.push(this.parsePageToRoute(s,u.root))}return e}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
1
+ import{createPluginFactory as l,BasePlugin as F}from"../../factory/index.mjs";import{writeFileContent as p,shouldUpdateFileContent as m}from"../../common/fs/index.mjs";import{resolve as n}from"path";import{existsSync as i,promises as c,watch as f}from"fs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";function g(r,t=/[/-]/){return r.replace(/^\/+/,"").split(t).filter(Boolean).map((e,u)=>u===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}function E(r,t=/[/-]/){return r.replace(/^\/+/,"").split(t).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}function D(r){return r.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"")}function C(r,t){return typeof t=="string"?"string":typeof t=="boolean"?t?"true":"false":typeof t=="number"?"number":"unknown"}function d(r){const t=Object.entries(r);return t.length===0?"{}":`{ ${t.map(([e,u])=>`${e}: ${C(e,u)}`).join("; ")} }`}function y(r,t="@meng-xi/uni-router"){const e=[];e.push(`import '${t}'`),e.push(""),e.push(`declare module '${t}' {`),e.push(" interface RouteNameMap {");for(const u of r){const s=u.name||u.path;u.meta?.title&&e.push(` /** ${u.meta.title} */`);const a=u.meta?d(u.meta):"{}";e.push(` ${s}: { path: '${u.path}'; meta: ${a} }`)}return e.push(" }"),e.push("}"),e.join(`
2
+ `)}class w extends F{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"},dts:!1}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").enum(["ts","js"]).field("nameStrategy").enum(["path","camelCase","pascalCase","custom"]).validate(),this.options.nameStrategy==="custom"&&!this.options.customNameGenerator)throw new Error("\u5F53 nameStrategy \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customNameGenerator")}getPluginName(){return"generate-router"}generateRouteName(t){switch(this.options.nameStrategy){case"path":return t.replace(/\//g,"_").replace(/^_/,"");case"camelCase":return g(t);case"pascalCase":return E(t);case"custom":return this.options.customNameGenerator(t);default:return g(t)}}extractMeta(t,e){const u={},s=t.style||{},a=this.options.metaMapping||{};for(const[o,h]of Object.entries(a))s[o]!==void 0&&(u[h]=s[o]);return this.tabBarPages.has(e)&&(u.isTab=!0),u}parsePageToRoute(t,e=""){const u=e?`/${e}/${t.path}`:`/${t.path}`,s=this.generateRouteName(u),a=this.extractMeta(t,u.replace(/^\//,"")),o={path:u,name:s};return Object.keys(a).length>0&&(o.meta=a),o}parsePagesJson(t){const e=[];if(!t.pages||!Array.isArray(t.pages)||t.pages.length===0)return this.logger.warn("pages.json \u4E2D\u6CA1\u6709\u6709\u6548\u7684\u9875\u9762\u914D\u7F6E"),e;if(this.tabBarPages.clear(),t.tabBar?.list)for(const u of t.tabBar.list)this.tabBarPages.add(u.pagePath);for(const u of t.pages)e.push(this.parsePageToRoute(u));if(this.options.includeSubPackages&&t.subPackages){for(const u of t.subPackages)if(u.pages&&Array.isArray(u.pages))for(const s of u.pages)e.push(this.parsePageToRoute(s,u.root))}return e}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
2
3
  /**
3
4
  * \u8DEF\u7531\u5143\u4FE1\u606F
4
5
  */
@@ -32,4 +33,4 @@ export interface RouteConfig {
32
33
  export const routes${u?": RouteConfig[]":""} = ${s}
33
34
 
34
35
  export default routes
35
- `}async readPagesJson(){const t=n(this.projectRoot,this.options.pagesJsonPath);if(!i(t))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`),null;try{const e=await c.readFile(t,"utf-8"),u=E(e);return JSON.parse(u)}catch(e){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${e.message}`),null}}extractExistingRoutes(t){const e=new Map,u=t.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!u)return e;try{let s=u[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const a=JSON.parse(s);for(const r of a)r.path&&e.set(r.path,r)}catch{this.logger.warn("\u89E3\u6790\u73B0\u6709 routes \u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u5B8C\u5168\u91CD\u65B0\u751F\u6210")}return e}mergeRoutes(t,e){return t.map(u=>{const s=e.get(u.path);if(!s)return u;const a={};return u.meta&&Object.assign(a,u.meta),s.meta&&Object.assign(a,s.meta),{...s,path:u.path,meta:Object.keys(a).length>0?a:void 0}})}async generateRouterConfig(){const t=await this.readPagesJson();if(!t)return;let e=this.parsePagesJson(t);const u=n(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&i(u))try{const a=await c.readFile(u,"utf-8"),r=this.extractExistingRoutes(a);r.size>0&&(e=this.mergeRoutes(e,r),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const s=this.generateFileContent(e);await F(u,s),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${u}`),this.logger.info(`\u5171\u751F\u6210 ${e.length} \u6761\u8DEF\u7531\u914D\u7F6E`)}startWatching(){if(!this.options.watch)return;const t=n(this.projectRoot,this.options.pagesJsonPath);i(t)&&(this.watcher=f(t,async e=>{e==="change"&&(this.logger.info("\u68C0\u6D4B\u5230 pages.json \u53D8\u5316\uFF0C\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E..."),await this.safeExecute(()=>this.generateRouterConfig(),"\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E"))}),this.logger.info(`\u6B63\u5728\u76D1\u542C pages.json \u53D8\u5316: ${t}`))}stopWatching(){this.watcher&&(this.watcher.close(),this.watcher=null)}addPluginHooks(t){t.configResolved=async e=>{this.projectRoot=e.root,await this.safeExecute(()=>this.generateRouterConfig(),"\u751F\u6210\u8DEF\u7531\u914D\u7F6E"),e.command==="serve"&&this.startWatching()}}destroy(){super.destroy(),this.stopWatching()}}const C=h(D);export{C as generateRouter};
36
+ `}async readPagesJson(){const t=n(this.projectRoot,this.options.pagesJsonPath);if(!i(t))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`),null;try{const e=await c.readFile(t,"utf-8"),u=D(e);return JSON.parse(u)}catch(e){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${e.message}`),null}}extractExistingRoutes(t){const e=new Map,u=t.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!u)return e;try{let s=u[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const a=JSON.parse(s);for(const o of a)o.path&&e.set(o.path,o)}catch{this.logger.warn("\u89E3\u6790\u73B0\u6709 routes \u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u5B8C\u5168\u91CD\u65B0\u751F\u6210")}return e}mergeRoutes(t,e){return t.map(u=>{const s=e.get(u.path);if(!s)return u;const a={};return u.meta&&Object.assign(a,u.meta),s.meta&&Object.assign(a,s.meta),{...s,path:u.path,meta:Object.keys(a).length>0?a:void 0}})}async generateRouterConfig(){const t=await this.readPagesJson();if(!t)return;let e=this.parsePagesJson(t);const u=n(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&i(u))try{const a=await c.readFile(u,"utf-8"),o=this.extractExistingRoutes(a);o.size>0&&(e=this.mergeRoutes(e,o),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const s=this.generateFileContent(e);await p(u,s),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${u}`),this.logger.info(`\u5171\u751F\u6210 ${e.length} \u6761\u8DEF\u7531\u914D\u7F6E`),await this.generateDtsFile(e)}async generateDtsFile(t){if(!this.options.dts)return;const e=n(this.projectRoot,typeof this.options.dts=="string"?this.options.dts:"src/router.d.ts"),u=y(t);m(e,u)&&(await p(e,u),this.logger.success(`\u8DEF\u7531\u7C7B\u578B\u58F0\u660E\u6587\u4EF6\u5DF2\u751F\u6210: ${e}`))}startWatching(){if(!this.options.watch)return;const t=n(this.projectRoot,this.options.pagesJsonPath);i(t)&&(this.watcher=f(t,async e=>{e==="change"&&(this.logger.info("\u68C0\u6D4B\u5230 pages.json \u53D8\u5316\uFF0C\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E..."),await this.safeExecute(()=>this.generateRouterConfig(),"\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E"))}),this.logger.info(`\u6B63\u5728\u76D1\u542C pages.json \u53D8\u5316: ${t}`))}stopWatching(){this.watcher&&(this.watcher.close(),this.watcher=null)}addPluginHooks(t){t.configResolved=async e=>{this.projectRoot=e.root,await this.safeExecute(()=>this.generateRouterConfig(),"\u751F\u6210\u8DEF\u7531\u914D\u7F6E"),e.command==="serve"&&this.startWatching()}}destroy(){super.destroy(),this.stopWatching()}}const B=l(w);export{B as generateRouter};
@@ -1 +1 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),common_format_index=require("../../common/format/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),m=require("path"),crypto=require("crypto");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs");function f(o=8){const e=Math.max(1,Math.min(64,o));return crypto.randomBytes(Math.ceil(e/2)).toString("hex").slice(0,e)}function c(o,e){let t=o;for(const[i,s]of Object.entries(e))t=t.replace(new RegExp(`\\{${i}\\}`,"g"),s);return t}class g extends factory_index.BasePlugin{version="";buildTime=new Date;getDefaultOptions(){return{format:"timestamp",semverBase:"1.0.0",outputType:"file",outputFile:"version.json",defineName:"__APP_VERSION__",hashLength:8,prefix:"",suffix:""}}validateOptions(){if(this.validator.field("format").enum(["timestamp","date","datetime","semver","hash","custom"]).field("outputType").enum(["file","define","both"]).field("hashLength").number().minValue(1).maxValue(32).validate(),this.options.format==="custom"&&!this.options.customFormat)throw new Error("\u5F53 format \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customFormat")}getPluginName(){return"generate-version"}generateVersion(){const e=common_format_index.getDateFormatParams(this.buildTime),t=f(this.options.hashLength);let i;switch(this.options.format){case"timestamp":i=`${e.YYYY}${e.MM}${e.DD}${e.HH}${e.mm}${e.ss}`;break;case"date":i=`${e.YYYY}.${e.MM}.${e.DD}`;break;case"datetime":i=`${e.YYYY}.${e.MM}.${e.DD}.${e.HH}${e.mm}${e.ss}`;break;case"semver":i=this.options.semverBase||"1.0.0";break;case"hash":i=t;break;case"custom":i=this.parseCustomFormat({...e,hash:t});break;default:i=e.timestamp}const s=this.options.prefix||"",n=this.options.suffix||"";return`${s}${i}${n}`}parseCustomFormat(e){const t={...e};if(this.options.semverBase){const[i,s,n]=this.options.semverBase.split(".");t.major=i||"1",t.minor=s||"0",t.patch=n||"0"}return c(this.options.customFormat||"",t)}generateVersionInfo(){return{version:this.version,buildTime:this.buildTime.toISOString(),timestamp:this.buildTime.getTime(),format:this.options.format,...this.options.extra}}async writeVersionFile(e){const t=m.join(e,this.options.outputFile||"version.json"),i=this.generateVersionInfo();await common_fs_index.writeFileContent(t,JSON.stringify(i,null,2)),this.logger.success(`\u7248\u672C\u6587\u4EF6\u5DF2\u751F\u6210: ${t}`)}addPluginHooks(e){e.configResolved=()=>{this.buildTime=new Date,this.version=this.generateVersion(),this.logger.info(`\u751F\u6210\u7248\u672C\u53F7: ${this.version}`)},(this.options.outputType==="define"||this.options.outputType==="both")&&(e.config=()=>{this.version||(this.buildTime=new Date,this.version=this.generateVersion());const t=this.options.defineName||"__APP_VERSION__";return this.logger.info(`\u6CE8\u5165\u5168\u5C40\u53D8\u91CF: ${t} = "${this.version}"`),{define:{[t]:JSON.stringify(this.version),[`${t}_INFO`]:JSON.stringify(this.generateVersionInfo())}}}),(this.options.outputType==="file"||this.options.outputType==="both")&&(e.writeBundle=async()=>{this.viteConfig&&await this.safeExecute(async()=>{const t=this.viteConfig.build.outDir;await this.writeVersionFile(t)},"\u5199\u5165\u7248\u672C\u6587\u4EF6")})}}const generateVersion=factory_index.createPluginFactory(g);exports.generateVersion=generateVersion;
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),crypto=require("crypto"),common_format_index=require("../../common/format/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),u=require("path");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs");function generateRandomHash(o=8){const e=Math.max(1,Math.min(64,o));return crypto.randomBytes(Math.ceil(e/2)).toString("hex").slice(0,e)}function parseTemplate(o,e){let t=o;for(const[i,s]of Object.entries(e))t=t.replace(new RegExp(`\\{${i}\\}`,"g"),s);return t}class f extends factory_index.BasePlugin{version="";buildTime=new Date;getDefaultOptions(){return{format:"timestamp",semverBase:"1.0.0",outputType:"file",outputFile:"version.json",defineName:"__APP_VERSION__",hashLength:8,prefix:"",suffix:""}}validateOptions(){if(this.validator.field("format").enum(["timestamp","date","datetime","semver","hash","custom"]).field("outputType").enum(["file","define","both"]).field("hashLength").number().minValue(1).maxValue(32).validate(),this.options.format==="custom"&&!this.options.customFormat)throw new Error("\u5F53 format \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customFormat")}getPluginName(){return"generate-version"}generateVersion(){const e=common_format_index.getDateFormatParams(this.buildTime),t=generateRandomHash(this.options.hashLength);let i;switch(this.options.format){case"timestamp":i=`${e.YYYY}${e.MM}${e.DD}${e.HH}${e.mm}${e.ss}`;break;case"date":i=`${e.YYYY}.${e.MM}.${e.DD}`;break;case"datetime":i=`${e.YYYY}.${e.MM}.${e.DD}.${e.HH}${e.mm}${e.ss}`;break;case"semver":i=this.options.semverBase||"1.0.0";break;case"hash":i=t;break;case"custom":i=this.parseCustomFormat({...e,hash:t});break;default:i=e.timestamp}const s=this.options.prefix||"",n=this.options.suffix||"";return`${s}${i}${n}`}parseCustomFormat(e){const t={...e};if(this.options.semverBase){const[i,s,n]=this.options.semverBase.split(".");t.major=i||"1",t.minor=s||"0",t.patch=n||"0"}return parseTemplate(this.options.customFormat||"",t)}generateVersionInfo(){return{version:this.version,buildTime:this.buildTime.toISOString(),timestamp:this.buildTime.getTime(),format:this.options.format,...this.options.extra}}async writeVersionFile(e){const t=u.join(e,this.options.outputFile||"version.json"),i=this.generateVersionInfo();await common_fs_index.writeFileContent(t,JSON.stringify(i,null,2)),this.logger.success(`\u7248\u672C\u6587\u4EF6\u5DF2\u751F\u6210: ${t}`)}addPluginHooks(e){e.configResolved=()=>{this.buildTime=new Date,this.version=this.generateVersion(),this.logger.info(`\u751F\u6210\u7248\u672C\u53F7: ${this.version}`)},(this.options.outputType==="define"||this.options.outputType==="both")&&(e.config=()=>{this.version||(this.buildTime=new Date,this.version=this.generateVersion());const t=this.options.defineName||"__APP_VERSION__";return this.logger.info(`\u6CE8\u5165\u5168\u5C40\u53D8\u91CF: ${t} = "${this.version}"`),{define:{[t]:JSON.stringify(this.version),[`${t}_INFO`]:JSON.stringify(this.generateVersionInfo())}}}),(this.options.outputType==="file"||this.options.outputType==="both")&&(e.writeBundle=async()=>{this.viteConfig&&await this.safeExecute(async()=>{const t=this.viteConfig.build.outDir;await this.writeVersionFile(t)},"\u5199\u5165\u7248\u672C\u6587\u4EF6")})}}const generateVersion=factory_index.createPluginFactory(f);exports.generateVersion=generateVersion;
@@ -1 +1 @@
1
- import{createPluginFactory as r,BasePlugin as a}from"../../factory/index.mjs";import{getDateFormatParams as u}from"../../common/format/index.mjs";import{writeFileContent as m}from"../../common/fs/index.mjs";import{join as h}from"path";import{randomBytes as p}from"crypto";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";function f(o=8){const t=Math.max(1,Math.min(64,o));return p(Math.ceil(t/2)).toString("hex").slice(0,t)}function l(o,t){let e=o;for(const[i,s]of Object.entries(t))e=e.replace(new RegExp(`\\{${i}\\}`,"g"),s);return e}class c extends a{version="";buildTime=new Date;getDefaultOptions(){return{format:"timestamp",semverBase:"1.0.0",outputType:"file",outputFile:"version.json",defineName:"__APP_VERSION__",hashLength:8,prefix:"",suffix:""}}validateOptions(){if(this.validator.field("format").enum(["timestamp","date","datetime","semver","hash","custom"]).field("outputType").enum(["file","define","both"]).field("hashLength").number().minValue(1).maxValue(32).validate(),this.options.format==="custom"&&!this.options.customFormat)throw new Error("\u5F53 format \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customFormat")}getPluginName(){return"generate-version"}generateVersion(){const t=u(this.buildTime),e=f(this.options.hashLength);let i;switch(this.options.format){case"timestamp":i=`${t.YYYY}${t.MM}${t.DD}${t.HH}${t.mm}${t.ss}`;break;case"date":i=`${t.YYYY}.${t.MM}.${t.DD}`;break;case"datetime":i=`${t.YYYY}.${t.MM}.${t.DD}.${t.HH}${t.mm}${t.ss}`;break;case"semver":i=this.options.semverBase||"1.0.0";break;case"hash":i=e;break;case"custom":i=this.parseCustomFormat({...t,hash:e});break;default:i=t.timestamp}const s=this.options.prefix||"",n=this.options.suffix||"";return`${s}${i}${n}`}parseCustomFormat(t){const e={...t};if(this.options.semverBase){const[i,s,n]=this.options.semverBase.split(".");e.major=i||"1",e.minor=s||"0",e.patch=n||"0"}return l(this.options.customFormat||"",e)}generateVersionInfo(){return{version:this.version,buildTime:this.buildTime.toISOString(),timestamp:this.buildTime.getTime(),format:this.options.format,...this.options.extra}}async writeVersionFile(t){const e=h(t,this.options.outputFile||"version.json"),i=this.generateVersionInfo();await m(e,JSON.stringify(i,null,2)),this.logger.success(`\u7248\u672C\u6587\u4EF6\u5DF2\u751F\u6210: ${e}`)}addPluginHooks(t){t.configResolved=()=>{this.buildTime=new Date,this.version=this.generateVersion(),this.logger.info(`\u751F\u6210\u7248\u672C\u53F7: ${this.version}`)},(this.options.outputType==="define"||this.options.outputType==="both")&&(t.config=()=>{this.version||(this.buildTime=new Date,this.version=this.generateVersion());const e=this.options.defineName||"__APP_VERSION__";return this.logger.info(`\u6CE8\u5165\u5168\u5C40\u53D8\u91CF: ${e} = "${this.version}"`),{define:{[e]:JSON.stringify(this.version),[`${e}_INFO`]:JSON.stringify(this.generateVersionInfo())}}}),(this.options.outputType==="file"||this.options.outputType==="both")&&(t.writeBundle=async()=>{this.viteConfig&&await this.safeExecute(async()=>{const e=this.viteConfig.build.outDir;await this.writeVersionFile(e)},"\u5199\u5165\u7248\u672C\u6587\u4EF6")})}}const g=r(c);export{g as generateVersion};
1
+ import{createPluginFactory as r,BasePlugin as a}from"../../factory/index.mjs";import{randomBytes as u}from"crypto";import{getDateFormatParams as m}from"../../common/format/index.mjs";import{writeFileContent as h}from"../../common/fs/index.mjs";import{join as p}from"path";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";function f(o=8){const t=Math.max(1,Math.min(64,o));return u(Math.ceil(t/2)).toString("hex").slice(0,t)}function l(o,t){let e=o;for(const[i,s]of Object.entries(t))e=e.replace(new RegExp(`\\{${i}\\}`,"g"),s);return e}class c extends a{version="";buildTime=new Date;getDefaultOptions(){return{format:"timestamp",semverBase:"1.0.0",outputType:"file",outputFile:"version.json",defineName:"__APP_VERSION__",hashLength:8,prefix:"",suffix:""}}validateOptions(){if(this.validator.field("format").enum(["timestamp","date","datetime","semver","hash","custom"]).field("outputType").enum(["file","define","both"]).field("hashLength").number().minValue(1).maxValue(32).validate(),this.options.format==="custom"&&!this.options.customFormat)throw new Error("\u5F53 format \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customFormat")}getPluginName(){return"generate-version"}generateVersion(){const t=m(this.buildTime),e=f(this.options.hashLength);let i;switch(this.options.format){case"timestamp":i=`${t.YYYY}${t.MM}${t.DD}${t.HH}${t.mm}${t.ss}`;break;case"date":i=`${t.YYYY}.${t.MM}.${t.DD}`;break;case"datetime":i=`${t.YYYY}.${t.MM}.${t.DD}.${t.HH}${t.mm}${t.ss}`;break;case"semver":i=this.options.semverBase||"1.0.0";break;case"hash":i=e;break;case"custom":i=this.parseCustomFormat({...t,hash:e});break;default:i=t.timestamp}const s=this.options.prefix||"",n=this.options.suffix||"";return`${s}${i}${n}`}parseCustomFormat(t){const e={...t};if(this.options.semverBase){const[i,s,n]=this.options.semverBase.split(".");e.major=i||"1",e.minor=s||"0",e.patch=n||"0"}return l(this.options.customFormat||"",e)}generateVersionInfo(){return{version:this.version,buildTime:this.buildTime.toISOString(),timestamp:this.buildTime.getTime(),format:this.options.format,...this.options.extra}}async writeVersionFile(t){const e=p(t,this.options.outputFile||"version.json"),i=this.generateVersionInfo();await h(e,JSON.stringify(i,null,2)),this.logger.success(`\u7248\u672C\u6587\u4EF6\u5DF2\u751F\u6210: ${e}`)}addPluginHooks(t){t.configResolved=()=>{this.buildTime=new Date,this.version=this.generateVersion(),this.logger.info(`\u751F\u6210\u7248\u672C\u53F7: ${this.version}`)},(this.options.outputType==="define"||this.options.outputType==="both")&&(t.config=()=>{this.version||(this.buildTime=new Date,this.version=this.generateVersion());const e=this.options.defineName||"__APP_VERSION__";return this.logger.info(`\u6CE8\u5165\u5168\u5C40\u53D8\u91CF: ${e} = "${this.version}"`),{define:{[e]:JSON.stringify(this.version),[`${e}_INFO`]:JSON.stringify(this.generateVersionInfo())}}}),(this.options.outputType==="file"||this.options.outputType==="both")&&(t.writeBundle=async()=>{this.viteConfig&&await this.safeExecute(async()=>{const e=this.viteConfig.build.outDir;await this.writeVersionFile(e)},"\u5199\u5165\u7248\u672C\u6587\u4EF6")})}}const g=r(c);export{g as generateVersion};
@@ -1,7 +1,7 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),security=require("../../shared/vite-plugin.CnOy46d3.cjs"),i=require("node:path");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs");function _interopDefaultCompat(t){return t&&typeof t=="object"&&"default"in t?t.default:t}const i__default=_interopDefaultCompat(i);function e(t){if(t){if(t.blockedTags&&!Array.isArray(t.blockedTags))throw new Error("security.blockedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(t.allowedTags&&!Array.isArray(t.allowedTags))throw new Error("security.allowedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(t.blockedAttributes&&!Array.isArray(t.blockedAttributes))throw new Error("security.blockedAttributes \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4")}}function validateRules(t){if(!t.rules||!Array.isArray(t.rules))throw new Error("rules \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4");if(t.rules.length===0)throw new Error("rules \u4E0D\u80FD\u4E3A\u7A7A\u6570\u7EC4");for(let n=0;n<t.rules.length;n++)s(t.rules[n],n)}function s(t,n){if(!t.content||typeof t.content!="string")throw new Error(`rules[${n}].content \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`);if(!t.position||typeof t.position!="string")throw new Error(`rules[${n}].position \u5FC5\u987B\u662F\u6709\u6548\u7684\u6CE8\u5165\u4F4D\u7F6E`);const o=["head-start","head-end","body-start","body-end","before-selector","after-selector","replace-selector"];if(!o.includes(t.position))throw new Error(`rules[${n}].position \u5FC5\u987B\u662F ${o.join(", ")} \u4E4B\u4E00`);if(t.position.includes("selector")&&!t.selector)throw new Error(`rules[${n}].position \u4E3A "${t.position}" \u65F6\uFF0Cselector \u4E3A\u5FC5\u586B\u9879`);if(t.priority!==void 0&&(typeof t.priority!="number"||t.priority<0))throw new Error(`rules[${n}].priority \u5FC5\u987B\u662F\u975E\u8D1F\u6570`);t.condition&&l(t.condition,n)}function l(t,n){if(!t)return;const o=["env","file-contains","custom"];if(!o.includes(t.type))throw new Error(`rules[${n}].condition.type \u5FC5\u987B\u662F ${o.join(", ")} \u4E4B\u4E00`);if(t.type==="custom"&&typeof t.value!="function")throw new Error(`rules[${n}].condition.type \u4E3A "custom" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u51FD\u6570`);if(t.type!=="custom"&&typeof t.value!="string")throw new Error(`rules[${n}].condition.type \u4E3A "${t.type}" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u5B57\u7B26\u4E32`)}function validateAll(t){validateRules(t),e(t.security)}function g(t,n,o){if(o==="regex"){try{const d=new RegExp(n),r=t.match(d);if(r&&r.index!==void 0)return{index:r.index,length:r[0].length}}catch{return null}return null}const c=t.indexOf(n);return c===-1?null:{index:c,length:n.length}}function p(t,n,o){let c=t;const d={...o,...n};for(const[r,a]of Object.entries(d)){const F=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),f=a.replace(/\$/g,"$$$$");c=c.replace(new RegExp(`\\{\\{${F}\\}\\}`,"g"),f)}return c}function y(t,n){let o=!1;switch(t.type){case"env":{const c=t.value,d=process.env[c];o=!!d&&d!=="false"&&d!=="0";break}case"file-contains":{const c=t.value;o=n.includes(c);break}case"custom":{const c=t.value;try{o=!!c()}catch{o=!1}break}}return t.negate?!o:o}function x(t){return[...t].sort((n,o)=>(n.priority??100)-(o.priority??100))}function h(t,n,o,c,d){switch(o){case"head-start":{const r=t.match(/<head\b[^>]*>/i);if(!r)return{html:t,injected:!1,reason:"\u672A\u627E\u5230 <head> \u6807\u7B7E"};const a=(r.index??0)+r[0].length;return{html:t.slice(0,a)+`
2
- `+n+t.slice(a),injected:!0}}case"head-end":{const r=t.match(/<\/head\s*>/i);if(!r)return{html:t,injected:!1,reason:"\u672A\u627E\u5230 </head> \u6807\u7B7E"};const a=r.index;return{html:t.slice(0,a)+n+`
3
- `+t.slice(a),injected:!0}}case"body-start":{const r=t.match(/<body\b[^>]*>/i);if(!r)return{html:t,injected:!1,reason:"\u672A\u627E\u5230 <body> \u6807\u7B7E"};const a=(r.index??0)+r[0].length;return{html:t.slice(0,a)+`
4
- `+n+t.slice(a),injected:!0}}case"body-end":{const r=t.match(/<\/body\s*>/i);if(!r)return{html:t,injected:!1,reason:"\u672A\u627E\u5230 </body> \u6807\u7B7E"};const a=r.index;return{html:t.slice(0,a)+n+`
5
- `+t.slice(a),injected:!0}}case"before-selector":{if(!c)return{html:t,injected:!1,reason:"before-selector \u9700\u8981 selector \u53C2\u6570"};const r=g(t,c,d);return r?{html:t.slice(0,r.index)+n+`
6
- `+t.slice(r.index),injected:!0}:{html:t,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${c}"`}}case"after-selector":{if(!c)return{html:t,injected:!1,reason:"after-selector \u9700\u8981 selector \u53C2\u6570"};const r=g(t,c,d);if(!r)return{html:t,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${c}"`};const a=r.index+r.length;return{html:t.slice(0,a)+`
7
- `+n+t.slice(a),injected:!0}}case"replace-selector":{if(!c)return{html:t,injected:!1,reason:"replace-selector \u9700\u8981 selector \u53C2\u6570"};const r=g(t,c,d);if(!r)return{html:t,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${c}"`};const a=r.index+r.length;return{html:t.slice(0,r.index)+n+t.slice(a),injected:!0}}default:return{html:t,injected:!1,reason:`\u4E0D\u652F\u6301\u7684\u6CE8\u5165\u4F4D\u7F6E: ${o}`}}}function processRules(t,n,o,c,d){let r=t;const a=[],F=x(n);for(const f of F){const E={ruleId:f.id||"unnamed",position:f.position,selector:f.selector,injected:!1,timestamp:Date.now()};if(f.condition&&!y(f.condition,r)){E.injected=!1,E.reason="\u6761\u4EF6\u4E0D\u6EE1\u8DB3\uFF0C\u8DF3\u8FC7\u6CE8\u5165",a.push(E);continue}let m=p(f.content,f.templateVars,o);try{m=security.sanitizeContent(m,f,c,d)}catch(C){E.injected=!1,E.reason=C.message,a.push(E),d?.warn(`\u89C4\u5219 "${f.id||"unnamed"}" \u5B89\u5168\u68C0\u67E5\u5931\u8D25: ${C.message}`);continue}const j=h(r,m,f.position,f.selector,f.selectorMatch);r=j.html,E.injected=j.injected,E.reason=j.reason,a.push(E)}return{html:r,logs:a}}class u extends factory_index.BasePlugin{injectionLogs=[];getDefaultOptions(){return{targetFile:"index.html",logInjection:!0,security:{blockDangerousTags:!0,blockDangerousAttributes:!0}}}validateOptions(){this.validator.field("targetFile").string().field("rules").required().field("logInjection").boolean().validate(),validateAll(this.options)}getPluginName(){return"html-inject"}isTargetFile(n,o){if(o==="index.html")return n.endsWith("index.html")||n.endsWith("index.htm");const c=o.replace(/\\/g,"/"),d=n.replace(/\\/g,"/");return d.endsWith(c)?!0:i__default.basename(d)===i__default.basename(c)}addPluginHooks(n){n.transformIndexHtml={order:"post",handler:(o,c)=>{const d=c.filename||"",r=this.options.targetFile||"index.html";if(!this.isTargetFile(d,r))return o;const a={warn:f=>this.logger.warn(f)},F=processRules(o,this.options.rules,this.options.templateVars,this.options.security,a);return this.injectionLogs=F.logs,this.options.logInjection&&this.logInjectionResults(F.logs),F.html}},n.buildEnd=()=>{this.options.logInjection&&this.injectionLogs.length>0&&this.logger.info(`\u6CE8\u5165\u5B8C\u6210\uFF0C\u5171\u5904\u7406 ${this.injectionLogs.length} \u6761\u89C4\u5219`)}}logInjectionResults(n){for(const o of n)o.injected?this.logger.success(`\u89C4\u5219 "${o.ruleId}" \u6CE8\u5165\u6210\u529F (\u4F4D\u7F6E: ${o.position}${o.selector?`, \u9009\u62E9\u5668: ${o.selector}`:""})`):this.logger.warn(`\u89C4\u5219 "${o.ruleId}" \u6CE8\u5165\u5931\u8D25: ${o.reason||"\u672A\u77E5\u539F\u56E0"}`)}getInjectionLogs(){return[...this.injectionLogs]}}const htmlInject=factory_index.createPluginFactory(u);exports.htmlInject=htmlInject;
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),security=require("../../shared/vite-plugin.CcvHfrL8.cjs"),common_format_index=require("../../common/format/index.cjs"),l$1=require("node:path"),common_path_index=require("../../common/path/index.cjs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs");function _interopDefaultCompat(t){return t&&typeof t=="object"&&"default"in t?t.default:t}const l__default=_interopDefaultCompat(l$1);function e(t){if(t){if(t.blockedTags&&!Array.isArray(t.blockedTags))throw new Error("security.blockedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(t.allowedTags&&!Array.isArray(t.allowedTags))throw new Error("security.allowedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(t.blockedAttributes&&!Array.isArray(t.blockedAttributes))throw new Error("security.blockedAttributes \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4")}}function validateRules(t){if(!t.rules||!Array.isArray(t.rules))throw new Error("rules \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4");if(t.rules.length===0)throw new Error("rules \u4E0D\u80FD\u4E3A\u7A7A\u6570\u7EC4");for(let u=0;u<t.rules.length;u++)s(t.rules[u],u)}function s(t,u){if(!t.content||typeof t.content!="string")throw new Error(`rules[${u}].content \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`);if(!t.position||typeof t.position!="string")throw new Error(`rules[${u}].position \u5FC5\u987B\u662F\u6709\u6548\u7684\u6CE8\u5165\u4F4D\u7F6E`);const r=["head-start","head-end","body-start","body-end","before-selector","after-selector","replace-selector"];if(!r.includes(t.position))throw new Error(`rules[${u}].position \u5FC5\u987B\u662F ${r.join(", ")} \u4E4B\u4E00`);if(t.position.includes("selector")&&!t.selector)throw new Error(`rules[${u}].position \u4E3A "${t.position}" \u65F6\uFF0Cselector \u4E3A\u5FC5\u586B\u9879`);if(t.priority!==void 0&&(typeof t.priority!="number"||t.priority<0))throw new Error(`rules[${u}].priority \u5FC5\u987B\u662F\u975E\u8D1F\u6570`);t.condition&&l(t.condition,u)}function l(t,u){if(!t)return;const r=["env","file-contains","custom"];if(!r.includes(t.type))throw new Error(`rules[${u}].condition.type \u5FC5\u987B\u662F ${r.join(", ")} \u4E4B\u4E00`);if(t.type==="custom"&&typeof t.value!="function")throw new Error(`rules[${u}].condition.type \u4E3A "custom" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u51FD\u6570`);if(t.type!=="custom"&&typeof t.value!="string")throw new Error(`rules[${u}].condition.type \u4E3A "${t.type}" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u5B57\u7B26\u4E32`)}function validateAll(t){validateRules(t),e(t.security)}function f(t,u,r){if(r==="regex"){try{const c=new RegExp(u),n=t.match(c);if(n&&n.index!==void 0)return{index:n.index,length:n[0].length}}catch{return null}return null}const o=t.indexOf(u);return o===-1?null:{index:o,length:u.length}}function p(t,u,r){const o={...r,...u};return common_format_index.parseTemplate(t,o)}function x(t,u){let r=!1;switch(t.type){case"env":{const o=t.value,c=process.env[o];r=!!c&&c!=="false"&&c!=="0";break}case"file-contains":{const o=t.value;r=u.includes(o);break}case"custom":{const o=t.value;try{r=!!o()}catch{r=!1}break}}return t.negate?!r:r}function h(t){return[...t].sort((u,r)=>(u.priority??100)-(r.priority??100))}function b(t,u,r,o,c){switch(r){case"head-start":{const n=t.match(/<head\b[^>]*>/i);if(!n)return{html:t,injected:!1,reason:"\u672A\u627E\u5230 <head> \u6807\u7B7E"};const i=(n.index??0)+n[0].length;return{html:t.slice(0,i)+`
2
+ `+u+t.slice(i),injected:!0}}case"head-end":{const n=t.match(/<\/head\s*>/i);if(!n)return{html:t,injected:!1,reason:"\u672A\u627E\u5230 </head> \u6807\u7B7E"};const i=n.index;return{html:t.slice(0,i)+u+`
3
+ `+t.slice(i),injected:!0}}case"body-start":{const n=t.match(/<body\b[^>]*>/i);if(!n)return{html:t,injected:!1,reason:"\u672A\u627E\u5230 <body> \u6807\u7B7E"};const i=(n.index??0)+n[0].length;return{html:t.slice(0,i)+`
4
+ `+u+t.slice(i),injected:!0}}case"body-end":{const n=t.match(/<\/body\s*>/i);if(!n)return{html:t,injected:!1,reason:"\u672A\u627E\u5230 </body> \u6807\u7B7E"};const i=n.index;return{html:t.slice(0,i)+u+`
5
+ `+t.slice(i),injected:!0}}case"before-selector":{if(!o)return{html:t,injected:!1,reason:"before-selector \u9700\u8981 selector \u53C2\u6570"};const n=f(t,o,c);return n?{html:t.slice(0,n.index)+u+`
6
+ `+t.slice(n.index),injected:!0}:{html:t,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${o}"`}}case"after-selector":{if(!o)return{html:t,injected:!1,reason:"after-selector \u9700\u8981 selector \u53C2\u6570"};const n=f(t,o,c);if(!n)return{html:t,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${o}"`};const i=n.index+n.length;return{html:t.slice(0,i)+`
7
+ `+u+t.slice(i),injected:!0}}case"replace-selector":{if(!o)return{html:t,injected:!1,reason:"replace-selector \u9700\u8981 selector \u53C2\u6570"};const n=f(t,o,c);if(!n)return{html:t,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${o}"`};const i=n.index+n.length;return{html:t.slice(0,n.index)+u+t.slice(i),injected:!0}}default:return{html:t,injected:!1,reason:`\u4E0D\u652F\u6301\u7684\u6CE8\u5165\u4F4D\u7F6E: ${r}`}}}function processRules(t,u,r,o,c){let n=t;const i=[],g=h(u);for(const a of g){const d={ruleId:a.id||"unnamed",position:a.position,selector:a.selector,injected:!1,timestamp:Date.now()};if(a.condition&&!x(a.condition,n)){d.injected=!1,d.reason="\u6761\u4EF6\u4E0D\u6EE1\u8DB3\uFF0C\u8DF3\u8FC7\u6CE8\u5165",i.push(d);continue}let E=p(a.content,a.templateVars,r);try{E=security.sanitizeContent(E,a,o,c)}catch(y){d.injected=!1,d.reason=y.message,i.push(d),c?.warn(`\u89C4\u5219 "${a.id||"unnamed"}" \u5B89\u5168\u68C0\u67E5\u5931\u8D25: ${y.message}`);continue}const F=b(n,E,a.position,a.selector,a.selectorMatch);n=F.html,d.injected=F.injected,d.reason=F.reason,i.push(d)}return{html:n,logs:i}}class m extends factory_index.BasePlugin{injectionLogs=[];getDefaultOptions(){return{targetFile:"index.html",logInjection:!0,security:{blockDangerousTags:!0,blockDangerousAttributes:!0}}}validateOptions(){this.validator.field("targetFile").string().field("rules").required().field("logInjection").boolean().validate(),validateAll(this.options)}getPluginName(){return"html-inject"}isTargetFile(u,r){if(r==="index.html")return u.endsWith("index.html")||u.endsWith("index.htm");const o=common_path_index.normalizePath(r),c=common_path_index.normalizePath(u);return c.endsWith(o)?!0:l__default.basename(c)===l__default.basename(o)}addPluginHooks(u){u.transformIndexHtml={order:"post",handler:(r,o)=>{const c=o.filename||"",n=this.options.targetFile||"index.html";if(!this.isTargetFile(c,n))return r;const i={warn:a=>this.logger.warn(a)},g=processRules(r,this.options.rules,this.options.templateVars,this.options.security,i);return this.injectionLogs=g.logs,this.options.logInjection&&this.logInjectionResults(g.logs),g.html}},u.buildEnd=()=>{this.options.logInjection&&this.injectionLogs.length>0&&this.logger.info(`\u6CE8\u5165\u5B8C\u6210\uFF0C\u5171\u5904\u7406 ${this.injectionLogs.length} \u6761\u89C4\u5219`)}}logInjectionResults(u){for(const r of u)r.injected?this.logger.success(`\u89C4\u5219 "${r.ruleId}" \u6CE8\u5165\u6210\u529F (\u4F4D\u7F6E: ${r.position}${r.selector?`, \u9009\u62E9\u5668: ${r.selector}`:""})`):this.logger.warn(`\u89C4\u5219 "${r.ruleId}" \u6CE8\u5165\u5931\u8D25: ${r.reason||"\u672A\u77E5\u539F\u56E0"}`)}getInjectionLogs(){return[...this.injectionLogs]}}const htmlInject=factory_index.createPluginFactory(m);exports.htmlInject=htmlInject;