@jonathanleelx/meddle 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONFIG_STRUCTURE.md +315 -0
- package/LICENSE +21 -0
- package/README.md +298 -0
- package/bin/commands/mock/add.js +92 -0
- package/bin/commands/mock/delete.js +58 -0
- package/bin/commands/mock/index.js +50 -0
- package/bin/commands/mock/list.js +68 -0
- package/bin/commands/mock/toggle.js +64 -0
- package/bin/commands/mock/update.js +94 -0
- package/bin/commands/route/active.js +141 -0
- package/bin/commands/route/add.js +127 -0
- package/bin/commands/route/create.js +77 -0
- package/bin/commands/route/delete.js +120 -0
- package/bin/commands/route/index.js +59 -0
- package/bin/commands/route/list.js +67 -0
- package/bin/commands/route/preview.js +159 -0
- package/bin/commands/route/show.js +111 -0
- package/bin/commands/route/update.js +126 -0
- package/bin/commands/session/create.js +166 -0
- package/bin/commands/session/delete.js +69 -0
- package/bin/commands/session/index.js +61 -0
- package/bin/commands/session/list.js +42 -0
- package/bin/commands/session/prune.js +31 -0
- package/bin/commands/start.js +43 -0
- package/bin/commands/status.js +115 -0
- package/bin/commands/supervise.js +106 -0
- package/bin/commands/url.js +30 -0
- package/bin/doctor.js +356 -0
- package/bin/index +130 -0
- package/bin/lib/api-client.js +72 -0
- package/bin/lib/file-access.js +337 -0
- package/bin/lib/meddle-home.js +20 -0
- package/bin/lib/output.js +146 -0
- package/bin/lib/parsers.js +127 -0
- package/bin/lib/proxy-detect.js +105 -0
- package/bin/lib/route-preview.js +180 -0
- package/bin/lib/session-args.js +54 -0
- package/bin/lib/sessions.js +213 -0
- package/dist/cert.d.ts +10 -0
- package/dist/cert.d.ts.map +1 -0
- package/dist/cert.js +184 -0
- package/dist/cert.js.map +1 -0
- package/dist/core/application-identity.d.ts +55 -0
- package/dist/core/application-identity.d.ts.map +1 -0
- package/dist/core/application-identity.js +321 -0
- package/dist/core/application-identity.js.map +1 -0
- package/dist/core/body-utils.d.ts +2 -0
- package/dist/core/body-utils.d.ts.map +1 -0
- package/dist/core/body-utils.js +21 -0
- package/dist/core/body-utils.js.map +1 -0
- package/dist/core/browser.d.ts +2 -0
- package/dist/core/browser.d.ts.map +1 -0
- package/dist/core/browser.js +92 -0
- package/dist/core/browser.js.map +1 -0
- package/dist/core/client-identity.d.ts +27 -0
- package/dist/core/client-identity.d.ts.map +1 -0
- package/dist/core/client-identity.js +136 -0
- package/dist/core/client-identity.js.map +1 -0
- package/dist/core/config-diagnostics.d.ts +14 -0
- package/dist/core/config-diagnostics.d.ts.map +1 -0
- package/dist/core/config-diagnostics.js +137 -0
- package/dist/core/config-diagnostics.js.map +1 -0
- package/dist/core/connect-tunnel.d.ts +5 -0
- package/dist/core/connect-tunnel.d.ts.map +1 -0
- package/dist/core/connect-tunnel.js +45 -0
- package/dist/core/connect-tunnel.js.map +1 -0
- package/dist/core/content-encoding.d.ts +2 -0
- package/dist/core/content-encoding.d.ts.map +1 -0
- package/dist/core/content-encoding.js +77 -0
- package/dist/core/content-encoding.js.map +1 -0
- package/dist/core/custom-plugin-loader.d.ts +18 -0
- package/dist/core/custom-plugin-loader.d.ts.map +1 -0
- package/dist/core/custom-plugin-loader.js +178 -0
- package/dist/core/custom-plugin-loader.js.map +1 -0
- package/dist/core/h2-pool.d.ts +4 -0
- package/dist/core/h2-pool.d.ts.map +1 -0
- package/dist/core/h2-pool.js +180 -0
- package/dist/core/h2-pool.js.map +1 -0
- package/dist/core/inspection-dispatch.d.ts +5 -0
- package/dist/core/inspection-dispatch.d.ts.map +1 -0
- package/dist/core/inspection-dispatch.js +146 -0
- package/dist/core/inspection-dispatch.js.map +1 -0
- package/dist/core/log-rate-limit.d.ts +34 -0
- package/dist/core/log-rate-limit.d.ts.map +1 -0
- package/dist/core/log-rate-limit.js +52 -0
- package/dist/core/log-rate-limit.js.map +1 -0
- package/dist/core/map-local.d.ts +4 -0
- package/dist/core/map-local.d.ts.map +1 -0
- package/dist/core/map-local.js +195 -0
- package/dist/core/map-local.js.map +1 -0
- package/dist/core/meddle-home.d.ts +13 -0
- package/dist/core/meddle-home.d.ts.map +1 -0
- package/dist/core/meddle-home.js +56 -0
- package/dist/core/meddle-home.js.map +1 -0
- package/dist/core/mock-gate.d.ts +3 -0
- package/dist/core/mock-gate.d.ts.map +1 -0
- package/dist/core/mock-gate.js +20 -0
- package/dist/core/mock-gate.js.map +1 -0
- package/dist/core/mock-handler.d.ts +5 -0
- package/dist/core/mock-handler.d.ts.map +1 -0
- package/dist/core/mock-handler.js +339 -0
- package/dist/core/mock-handler.js.map +1 -0
- package/dist/core/on-mode-gate.d.ts +4 -0
- package/dist/core/on-mode-gate.d.ts.map +1 -0
- package/dist/core/on-mode-gate.js +64 -0
- package/dist/core/on-mode-gate.js.map +1 -0
- package/dist/core/pipeline-gate.d.ts +3 -0
- package/dist/core/pipeline-gate.d.ts.map +1 -0
- package/dist/core/pipeline-gate.js +34 -0
- package/dist/core/pipeline-gate.js.map +1 -0
- package/dist/core/pipeline.d.ts +6 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +228 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/plugin-bootstrap-runner.d.ts +6 -0
- package/dist/core/plugin-bootstrap-runner.d.ts.map +1 -0
- package/dist/core/plugin-bootstrap-runner.js +148 -0
- package/dist/core/plugin-bootstrap-runner.js.map +1 -0
- package/dist/core/plugin-bootstrap.d.ts +3 -0
- package/dist/core/plugin-bootstrap.d.ts.map +1 -0
- package/dist/core/plugin-bootstrap.js +15 -0
- package/dist/core/plugin-bootstrap.js.map +1 -0
- package/dist/core/plugin-compiler.d.ts +37 -0
- package/dist/core/plugin-compiler.d.ts.map +1 -0
- package/dist/core/plugin-compiler.js +172 -0
- package/dist/core/plugin-compiler.js.map +1 -0
- package/dist/core/plugin-context-factory.d.ts +29 -0
- package/dist/core/plugin-context-factory.d.ts.map +1 -0
- package/dist/core/plugin-context-factory.js +206 -0
- package/dist/core/plugin-context-factory.js.map +1 -0
- package/dist/core/plugin-generator.d.ts +47 -0
- package/dist/core/plugin-generator.d.ts.map +1 -0
- package/dist/core/plugin-generator.js +697 -0
- package/dist/core/plugin-generator.js.map +1 -0
- package/dist/core/plugin-health.d.ts +3 -0
- package/dist/core/plugin-health.d.ts.map +1 -0
- package/dist/core/plugin-health.js +54 -0
- package/dist/core/plugin-health.js.map +1 -0
- package/dist/core/plugin-intercept.d.ts +17 -0
- package/dist/core/plugin-intercept.d.ts.map +1 -0
- package/dist/core/plugin-intercept.js +133 -0
- package/dist/core/plugin-intercept.js.map +1 -0
- package/dist/core/plugin-runtime.d.ts +33 -0
- package/dist/core/plugin-runtime.d.ts.map +1 -0
- package/dist/core/plugin-runtime.js +254 -0
- package/dist/core/plugin-runtime.js.map +1 -0
- package/dist/core/proxy-context.d.ts +3 -0
- package/dist/core/proxy-context.d.ts.map +1 -0
- package/dist/core/proxy-context.js +129 -0
- package/dist/core/proxy-context.js.map +1 -0
- package/dist/core/proxy-record.d.ts +3 -0
- package/dist/core/proxy-record.d.ts.map +1 -0
- package/dist/core/proxy-record.js +32 -0
- package/dist/core/proxy-record.js.map +1 -0
- package/dist/core/refactor-config.d.ts +6 -0
- package/dist/core/refactor-config.d.ts.map +1 -0
- package/dist/core/refactor-config.js +45 -0
- package/dist/core/refactor-config.js.map +1 -0
- package/dist/core/refactor-status.d.ts +3 -0
- package/dist/core/refactor-status.d.ts.map +1 -0
- package/dist/core/refactor-status.js +19 -0
- package/dist/core/refactor-status.js.map +1 -0
- package/dist/core/remote-access.d.ts +40 -0
- package/dist/core/remote-access.d.ts.map +1 -0
- package/dist/core/remote-access.js +281 -0
- package/dist/core/remote-access.js.map +1 -0
- package/dist/core/route-decision.d.ts +3 -0
- package/dist/core/route-decision.d.ts.map +1 -0
- package/dist/core/route-decision.js +20 -0
- package/dist/core/route-decision.js.map +1 -0
- package/dist/core/route-loader.d.ts +14 -0
- package/dist/core/route-loader.d.ts.map +1 -0
- package/dist/core/route-loader.js +94 -0
- package/dist/core/route-loader.js.map +1 -0
- package/dist/core/route-preview.d.ts +15 -0
- package/dist/core/route-preview.d.ts.map +1 -0
- package/dist/core/route-preview.js +91 -0
- package/dist/core/route-preview.js.map +1 -0
- package/dist/core/runtime-health.d.ts +92 -0
- package/dist/core/runtime-health.d.ts.map +1 -0
- package/dist/core/runtime-health.js +205 -0
- package/dist/core/runtime-health.js.map +1 -0
- package/dist/core/sessions.d.ts +19 -0
- package/dist/core/sessions.d.ts.map +1 -0
- package/dist/core/sessions.js +93 -0
- package/dist/core/sessions.js.map +1 -0
- package/dist/core/shadow-compare.d.ts +8 -0
- package/dist/core/shadow-compare.d.ts.map +1 -0
- package/dist/core/shadow-compare.js +83 -0
- package/dist/core/shadow-compare.js.map +1 -0
- package/dist/core/shadow-readiness.d.ts +4 -0
- package/dist/core/shadow-readiness.d.ts.map +1 -0
- package/dist/core/shadow-readiness.js +118 -0
- package/dist/core/shadow-readiness.js.map +1 -0
- package/dist/core/short-response.d.ts +5 -0
- package/dist/core/short-response.d.ts.map +1 -0
- package/dist/core/short-response.js +18 -0
- package/dist/core/short-response.js.map +1 -0
- package/dist/core/static-server.d.ts +9 -0
- package/dist/core/static-server.d.ts.map +1 -0
- package/dist/core/static-server.js +136 -0
- package/dist/core/static-server.js.map +1 -0
- package/dist/core/types.d.ts +590 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/helpers.d.ts +36 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +290 -0
- package/dist/helpers.js.map +1 -0
- package/dist/plugins/builtin/index.d.ts +3 -0
- package/dist/plugins/builtin/index.d.ts.map +1 -0
- package/dist/plugins/builtin/index.js +23 -0
- package/dist/plugins/builtin/index.js.map +1 -0
- package/dist/plugins/builtin/logger-plugin.d.ts +8 -0
- package/dist/plugins/builtin/logger-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/logger-plugin.js +121 -0
- package/dist/plugins/builtin/logger-plugin.js.map +1 -0
- package/dist/plugins/builtin/mock-plugin.d.ts +3 -0
- package/dist/plugins/builtin/mock-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/mock-plugin.js +99 -0
- package/dist/plugins/builtin/mock-plugin.js.map +1 -0
- package/dist/plugins/builtin/router-plugin.d.ts +3 -0
- package/dist/plugins/builtin/router-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/router-plugin.js +36 -0
- package/dist/plugins/builtin/router-plugin.js.map +1 -0
- package/dist/server/agent/model.d.ts +30 -0
- package/dist/server/agent/model.d.ts.map +1 -0
- package/dist/server/agent/model.js +143 -0
- package/dist/server/agent/model.js.map +1 -0
- package/dist/server/agent/routes.d.ts +4 -0
- package/dist/server/agent/routes.d.ts.map +1 -0
- package/dist/server/agent/routes.js +188 -0
- package/dist/server/agent/routes.js.map +1 -0
- package/dist/server/agent/runtime.d.ts +12 -0
- package/dist/server/agent/runtime.d.ts.map +1 -0
- package/dist/server/agent/runtime.js +208 -0
- package/dist/server/agent/runtime.js.map +1 -0
- package/dist/server/agent/tools.d.ts +13 -0
- package/dist/server/agent/tools.d.ts.map +1 -0
- package/dist/server/agent/tools.js +1201 -0
- package/dist/server/agent/tools.js.map +1 -0
- package/dist/server/agent/types.d.ts +56 -0
- package/dist/server/agent/types.d.ts.map +1 -0
- package/dist/server/agent/types.js +3 -0
- package/dist/server/agent/types.js.map +1 -0
- package/dist/server/config.d.ts +9 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +124 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/health.d.ts +4 -0
- package/dist/server/health.d.ts.map +1 -0
- package/dist/server/health.js +22 -0
- package/dist/server/health.js.map +1 -0
- package/dist/server/index.d.ts +239 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +44 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/logs.d.ts +4 -0
- package/dist/server/logs.d.ts.map +1 -0
- package/dist/server/logs.js +40 -0
- package/dist/server/logs.js.map +1 -0
- package/dist/server/mocks.d.ts +9 -0
- package/dist/server/mocks.d.ts.map +1 -0
- package/dist/server/mocks.js +103 -0
- package/dist/server/mocks.js.map +1 -0
- package/dist/server/pipeline.d.ts +16 -0
- package/dist/server/pipeline.d.ts.map +1 -0
- package/dist/server/pipeline.js +159 -0
- package/dist/server/pipeline.js.map +1 -0
- package/dist/server/plugins.d.ts +32 -0
- package/dist/server/plugins.d.ts.map +1 -0
- package/dist/server/plugins.js +795 -0
- package/dist/server/plugins.js.map +1 -0
- package/dist/server/refactor.d.ts +4 -0
- package/dist/server/refactor.d.ts.map +1 -0
- package/dist/server/refactor.js +86 -0
- package/dist/server/refactor.js.map +1 -0
- package/dist/server/rule-files.d.ts +34 -0
- package/dist/server/rule-files.d.ts.map +1 -0
- package/dist/server/rule-files.js +389 -0
- package/dist/server/rule-files.js.map +1 -0
- package/dist/server/rules.d.ts +4 -0
- package/dist/server/rules.d.ts.map +1 -0
- package/dist/server/rules.js +40 -0
- package/dist/server/rules.js.map +1 -0
- package/dist/server/sessions.d.ts +4 -0
- package/dist/server/sessions.d.ts.map +1 -0
- package/dist/server/sessions.js +20 -0
- package/dist/server/sessions.js.map +1 -0
- package/index.js +950 -0
- package/mcp-server.js +794 -0
- package/package.json +92 -0
- package/plugins/builtin/index.ts +25 -0
- package/plugins/builtin/logger-plugin.ts +126 -0
- package/plugins/builtin/mock-plugin.ts +112 -0
- package/plugins/builtin/router-plugin.ts +35 -0
- package/web/README.md +111 -0
- package/web/dist/assets/ai-config-store-DQXVJVn_.js +1 -0
- package/web/dist/assets/alert-COF-DIAE.js +1 -0
- package/web/dist/assets/arrow-right-B4Mrlj2-.js +1 -0
- package/web/dist/assets/babel-DsprIpXZ.js +15 -0
- package/web/dist/assets/body-diff-view-D7dCWajG.js +6 -0
- package/web/dist/assets/button-BTToMaBW.js +1 -0
- package/web/dist/assets/checkbox-DIBarrJx.js +1 -0
- package/web/dist/assets/chevron-down-CPngAx4M.js +1 -0
- package/web/dist/assets/chevron-right-V1DGIDbL.js +1 -0
- package/web/dist/assets/circle-alert-Q8cZk9Rv.js +1 -0
- package/web/dist/assets/circle-x-C9USji_R.js +1 -0
- package/web/dist/assets/code-5_eJ_XpJ.js +1 -0
- package/web/dist/assets/code-fixer-fQtWZ5He.js +20 -0
- package/web/dist/assets/copy-BYjq1hdN.js +1 -0
- package/web/dist/assets/detail-panel-BX_hxeI0.js +3 -0
- package/web/dist/assets/dist-B8XUKgXe.js +1 -0
- package/web/dist/assets/dist-Bb9TeEub.js +1 -0
- package/web/dist/assets/dist-C5nMErq8.js +1 -0
- package/web/dist/assets/dist-C6eaYCUo.js +1 -0
- package/web/dist/assets/dist-Cn0y0IRn.js +1 -0
- package/web/dist/assets/dist-CxdY_A67.js +5 -0
- package/web/dist/assets/dist-D5Dj17P8.js +1 -0
- package/web/dist/assets/dist-DZJ9SMlJ.js +1 -0
- package/web/dist/assets/es2015-CfXu88Y7.js +41 -0
- package/web/dist/assets/estree-BP7k0NIt.js +44 -0
- package/web/dist/assets/file-system-access-CtcvBfj4.js +1 -0
- package/web/dist/assets/global-panel-shell-ChdO0dWd.js +6 -0
- package/web/dist/assets/health-panel-CQeCQ7gr.js +1 -0
- package/web/dist/assets/html-6FIWbqxX.js +25 -0
- package/web/dist/assets/index-CjqaTnE_.css +2 -0
- package/web/dist/assets/index-L7uWxTnp.js +18 -0
- package/web/dist/assets/mobile-proxy-panel-Dj1iLami.js +8 -0
- package/web/dist/assets/mock-config-BTTCw7RK.js +1 -0
- package/web/dist/assets/mock-editor-panel-C-aVfFme.js +1 -0
- package/web/dist/assets/monaco-editor-B3brLg8j.js +11 -0
- package/web/dist/assets/pencil-line-Cqe41E4h.js +1 -0
- package/web/dist/assets/plugin-code-editor-CPjCbJ9g.js +2 -0
- package/web/dist/assets/plugin-config-BzmCkvz3.js +1 -0
- package/web/dist/assets/plugin-generator-BnEafDF9.js +2 -0
- package/web/dist/assets/plugin-test-dialog-BWoWsWV4.js +7 -0
- package/web/dist/assets/plus-tVxSydJ8.js +1 -0
- package/web/dist/assets/postcss-Dnf30fQU.js +61 -0
- package/web/dist/assets/refresh-cw-CG3HaiQT.js +1 -0
- package/web/dist/assets/rotate-ccw-CAYM6Vv0.js +1 -0
- package/web/dist/assets/route-preview-BX7sfY0O.js +1 -0
- package/web/dist/assets/rule-ai-assistant-panel-WBiOOUw5.js +47 -0
- package/web/dist/assets/rule-config-CHpVij2M.css +1 -0
- package/web/dist/assets/rule-config-fTIZVwg1.js +15 -0
- package/web/dist/assets/select-CkFOB61l.js +1 -0
- package/web/dist/assets/server-Cpj4KNwN.js +1 -0
- package/web/dist/assets/settings-panel-COCYiIUg.js +1 -0
- package/web/dist/assets/shield-check-OqUmVLQt.js +1 -0
- package/web/dist/assets/smartphone-DKeDuJTU.js +1 -0
- package/web/dist/assets/standalone-CjxtLKw-.js +29 -0
- package/web/dist/assets/switch-C-Xk56TK.js +1 -0
- package/web/dist/assets/syntax-highlight-DVhPdkuV.js +5 -0
- package/web/dist/assets/table-CT97lAYq.js +1 -0
- package/web/dist/assets/textarea-C6NooVK1.js +1 -0
- package/web/dist/assets/wand-sparkles-wkul5vje.js +1 -0
- package/web/dist/assets/wifi-D9M35Ajj.js +1 -0
- package/web/dist/assets/zap-Djo4cgux.js +1 -0
- package/web/dist/index.html +24 -0
- package/web/dist/vite.svg +1 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{a as e,d as t,f as n,l as r,t as i,u as a}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as o}from"./copy-BYjq1hdN.js";import{t as s}from"./refresh-cw-CG3HaiQT.js";import{t as c}from"./shield-check-OqUmVLQt.js";import{t as l}from"./smartphone-DKeDuJTU.js";import{t as u}from"./wifi-D9M35Ajj.js";import{A as d,F as f,L as p,M as m,N as h,O as g,P as _,R as v,j as y,k as b,mt as x,ot as S,tt as C,u as w,ut as ee,z as T}from"./index-L7uWxTnp.js";import{n as E,r as D,t as O}from"./alert-COF-DIAE.js";var te=r(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]),k=r(`shield-off`,[[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71`,key:`1jlk70`}],[`path`,{d:`M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264`,key:`18rp1v`}]]),A=t(((e,t)=>{t.exports=function(){return typeof Promise==`function`&&Promise.prototype&&Promise.prototype.then}})),j=t((e=>{var t,n=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];e.getSymbolSize=function(e){if(!e)throw Error(`"version" cannot be null or undefined`);if(e<1||e>40)throw Error(`"version" should be in range from 1 to 40`);return e*4+17},e.getSymbolTotalCodewords=function(e){return n[e]},e.getBCHDigit=function(e){let t=0;for(;e!==0;)t++,e>>>=1;return t},e.setToSJISFunction=function(e){if(typeof e!=`function`)throw Error(`"toSJISFunc" is not a valid function.`);t=e},e.isKanjiModeEnabled=function(){return t!==void 0},e.toSJIS=function(e){return t(e)}})),M=t((e=>{e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(t){if(typeof t!=`string`)throw Error(`Param is not a string`);switch(t.toLowerCase()){case`l`:case`low`:return e.L;case`m`:case`medium`:return e.M;case`q`:case`quartile`:return e.Q;case`h`:case`high`:return e.H;default:throw Error(`Unknown EC Level: `+t)}}e.isValid=function(e){return e&&e.bit!==void 0&&e.bit>=0&&e.bit<4},e.from=function(n,r){if(e.isValid(n))return n;try{return t(n)}catch{return r}}})),N=t(((e,t)=>{function n(){this.buffer=[],this.length=0}n.prototype={get:function(e){let t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)==1},put:function(e,t){for(let n=0;n<t;n++)this.putBit((e>>>t-n-1&1)==1)},getLengthInBits:function(){return this.length},putBit:function(e){let t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},t.exports=n})),P=t(((e,t)=>{function n(e){if(!e||e<1)throw Error(`BitMatrix size must be defined and greater than 0`);this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}n.prototype.set=function(e,t,n,r){let i=e*this.size+t;this.data[i]=n,r&&(this.reservedBit[i]=!0)},n.prototype.get=function(e,t){return this.data[e*this.size+t]},n.prototype.xor=function(e,t,n){this.data[e*this.size+t]^=n},n.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]},t.exports=n})),F=t((e=>{var t=j().getSymbolSize;e.getRowColCoords=function(e){if(e===1)return[];let n=Math.floor(e/7)+2,r=t(e),i=r===145?26:Math.ceil((r-13)/(2*n-2))*2,a=[r-7];for(let e=1;e<n-1;e++)a[e]=a[e-1]-i;return a.push(6),a.reverse()},e.getPositions=function(t){let n=[],r=e.getRowColCoords(t),i=r.length;for(let e=0;e<i;e++)for(let t=0;t<i;t++)e===0&&t===0||e===0&&t===i-1||e===i-1&&t===0||n.push([r[e],r[t]]);return n}})),I=t((e=>{var t=j().getSymbolSize,n=7;e.getPositions=function(e){let r=t(e);return[[0,0],[r-n,0],[0,r-n]]}})),L=t((e=>{e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var t={N1:3,N2:3,N3:40,N4:10};e.isValid=function(e){return e!=null&&e!==``&&!isNaN(e)&&e>=0&&e<=7},e.from=function(t){return e.isValid(t)?parseInt(t,10):void 0},e.getPenaltyN1=function(e){let n=e.size,r=0,i=0,a=0,o=null,s=null;for(let c=0;c<n;c++){i=a=0,o=s=null;for(let l=0;l<n;l++){let n=e.get(c,l);n===o?i++:(i>=5&&(r+=t.N1+(i-5)),o=n,i=1),n=e.get(l,c),n===s?a++:(a>=5&&(r+=t.N1+(a-5)),s=n,a=1)}i>=5&&(r+=t.N1+(i-5)),a>=5&&(r+=t.N1+(a-5))}return r},e.getPenaltyN2=function(e){let n=e.size,r=0;for(let t=0;t<n-1;t++)for(let i=0;i<n-1;i++){let n=e.get(t,i)+e.get(t,i+1)+e.get(t+1,i)+e.get(t+1,i+1);(n===4||n===0)&&r++}return r*t.N2},e.getPenaltyN3=function(e){let n=e.size,r=0,i=0,a=0;for(let t=0;t<n;t++){i=a=0;for(let o=0;o<n;o++)i=i<<1&2047|e.get(t,o),o>=10&&(i===1488||i===93)&&r++,a=a<<1&2047|e.get(o,t),o>=10&&(a===1488||a===93)&&r++}return r*t.N3},e.getPenaltyN4=function(e){let n=0,r=e.data.length;for(let t=0;t<r;t++)n+=e.data[t];return Math.abs(Math.ceil(n*100/r/5)-10)*t.N4};function n(t,n,r){switch(t){case e.Patterns.PATTERN000:return(n+r)%2==0;case e.Patterns.PATTERN001:return n%2==0;case e.Patterns.PATTERN010:return r%3==0;case e.Patterns.PATTERN011:return(n+r)%3==0;case e.Patterns.PATTERN100:return(Math.floor(n/2)+Math.floor(r/3))%2==0;case e.Patterns.PATTERN101:return n*r%2+n*r%3==0;case e.Patterns.PATTERN110:return(n*r%2+n*r%3)%2==0;case e.Patterns.PATTERN111:return(n*r%3+(n+r)%2)%2==0;default:throw Error(`bad maskPattern:`+t)}}e.applyMask=function(e,t){let r=t.size;for(let i=0;i<r;i++)for(let a=0;a<r;a++)t.isReserved(a,i)||t.xor(a,i,n(e,a,i))},e.getBestMask=function(t,n){let r=Object.keys(e.Patterns).length,i=0,a=1/0;for(let o=0;o<r;o++){n(o),e.applyMask(o,t);let r=e.getPenaltyN1(t)+e.getPenaltyN2(t)+e.getPenaltyN3(t)+e.getPenaltyN4(t);e.applyMask(o,t),r<a&&(a=r,i=o)}return i}})),R=t((e=>{var t=M(),n=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],r=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];e.getBlocksCount=function(e,r){switch(r){case t.L:return n[(e-1)*4+0];case t.M:return n[(e-1)*4+1];case t.Q:return n[(e-1)*4+2];case t.H:return n[(e-1)*4+3];default:return}},e.getTotalCodewordsCount=function(e,n){switch(n){case t.L:return r[(e-1)*4+0];case t.M:return r[(e-1)*4+1];case t.Q:return r[(e-1)*4+2];case t.H:return r[(e-1)*4+3];default:return}}})),z=t((e=>{var t=new Uint8Array(512),n=new Uint8Array(256);(function(){let e=1;for(let r=0;r<255;r++)t[r]=e,n[e]=r,e<<=1,e&256&&(e^=285);for(let e=255;e<512;e++)t[e]=t[e-255]})(),e.log=function(e){if(e<1)throw Error(`log(`+e+`)`);return n[e]},e.exp=function(e){return t[e]},e.mul=function(e,r){return e===0||r===0?0:t[n[e]+n[r]]}})),B=t((e=>{var t=z();e.mul=function(e,n){let r=new Uint8Array(e.length+n.length-1);for(let i=0;i<e.length;i++)for(let a=0;a<n.length;a++)r[i+a]^=t.mul(e[i],n[a]);return r},e.mod=function(e,n){let r=new Uint8Array(e);for(;r.length-n.length>=0;){let e=r[0];for(let i=0;i<n.length;i++)r[i]^=t.mul(n[i],e);let i=0;for(;i<r.length&&r[i]===0;)i++;r=r.slice(i)}return r},e.generateECPolynomial=function(n){let r=new Uint8Array([1]);for(let i=0;i<n;i++)r=e.mul(r,new Uint8Array([1,t.exp(i)]));return r}})),V=t(((e,t)=>{var n=B();function r(e){this.genPoly=void 0,this.degree=e,this.degree&&this.initialize(this.degree)}r.prototype.initialize=function(e){this.degree=e,this.genPoly=n.generateECPolynomial(this.degree)},r.prototype.encode=function(e){if(!this.genPoly)throw Error(`Encoder not initialized`);let t=new Uint8Array(e.length+this.degree);t.set(e);let r=n.mod(t,this.genPoly),i=this.degree-r.length;if(i>0){let e=new Uint8Array(this.degree);return e.set(r,i),e}return r},t.exports=r})),H=t((e=>{e.isValid=function(e){return!isNaN(e)&&e>=1&&e<=40}})),U=t((e=>{var t=`[0-9]+`,n=`[A-Z $%*+\\-./:]+`,r=`(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+`;r=r.replace(/u/g,`\\u`);var i=`(?:(?![A-Z0-9 $%*+\\-./:]|`+r+`)(?:.|[\r
|
|
2
|
+
]))+`;e.KANJI=new RegExp(r,`g`),e.BYTE_KANJI=RegExp(`[^A-Z0-9 $%*+\\-./:]+`,`g`),e.BYTE=new RegExp(i,`g`),e.NUMERIC=new RegExp(t,`g`),e.ALPHANUMERIC=new RegExp(n,`g`);var a=RegExp(`^`+r+`$`),o=RegExp(`^`+t+`$`),s=RegExp(`^[A-Z0-9 $%*+\\-./:]+$`);e.testKanji=function(e){return a.test(e)},e.testNumeric=function(e){return o.test(e)},e.testAlphanumeric=function(e){return s.test(e)}})),W=t((e=>{var t=H(),n=U();e.NUMERIC={id:`Numeric`,bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:`Alphanumeric`,bit:2,ccBits:[9,11,13]},e.BYTE={id:`Byte`,bit:4,ccBits:[8,16,16]},e.KANJI={id:`Kanji`,bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(e,n){if(!e.ccBits)throw Error(`Invalid mode: `+e);if(!t.isValid(n))throw Error(`Invalid version: `+n);return n>=1&&n<10?e.ccBits[0]:n<27?e.ccBits[1]:e.ccBits[2]},e.getBestModeForData=function(t){return n.testNumeric(t)?e.NUMERIC:n.testAlphanumeric(t)?e.ALPHANUMERIC:n.testKanji(t)?e.KANJI:e.BYTE},e.toString=function(e){if(e&&e.id)return e.id;throw Error(`Invalid mode`)},e.isValid=function(e){return e&&e.bit&&e.ccBits};function r(t){if(typeof t!=`string`)throw Error(`Param is not a string`);switch(t.toLowerCase()){case`numeric`:return e.NUMERIC;case`alphanumeric`:return e.ALPHANUMERIC;case`kanji`:return e.KANJI;case`byte`:return e.BYTE;default:throw Error(`Unknown mode: `+t)}}e.from=function(t,n){if(e.isValid(t))return t;try{return r(t)}catch{return n}}})),ne=t((e=>{var t=j(),n=R(),r=M(),i=W(),a=H(),o=7973,s=t.getBCHDigit(o);function c(t,n,r){for(let i=1;i<=40;i++)if(n<=e.getCapacity(i,r,t))return i}function l(e,t){return i.getCharCountIndicator(e,t)+4}function u(e,t){let n=0;return e.forEach(function(e){let r=l(e.mode,t);n+=r+e.getBitsLength()}),n}function d(t,n){for(let r=1;r<=40;r++)if(u(t,r)<=e.getCapacity(r,n,i.MIXED))return r}e.from=function(e,t){return a.isValid(e)?parseInt(e,10):t},e.getCapacity=function(e,r,o){if(!a.isValid(e))throw Error(`Invalid QR Code version`);o===void 0&&(o=i.BYTE);let s=(t.getSymbolTotalCodewords(e)-n.getTotalCodewordsCount(e,r))*8;if(o===i.MIXED)return s;let c=s-l(o,e);switch(o){case i.NUMERIC:return Math.floor(c/10*3);case i.ALPHANUMERIC:return Math.floor(c/11*2);case i.KANJI:return Math.floor(c/13);case i.BYTE:default:return Math.floor(c/8)}},e.getBestVersionForData=function(e,t){let n,i=r.from(t,r.M);if(Array.isArray(e)){if(e.length>1)return d(e,i);if(e.length===0)return 1;n=e[0]}else n=e;return c(n.mode,n.getLength(),i)},e.getEncodedBits=function(e){if(!a.isValid(e)||e<7)throw Error(`Invalid QR Code version`);let n=e<<12;for(;t.getBCHDigit(n)-s>=0;)n^=o<<t.getBCHDigit(n)-s;return e<<12|n}})),re=t((e=>{var t=j(),n=1335,r=21522,i=t.getBCHDigit(n);e.getEncodedBits=function(e,a){let o=e.bit<<3|a,s=o<<10;for(;t.getBCHDigit(s)-i>=0;)s^=n<<t.getBCHDigit(s)-i;return(o<<10|s)^r}})),G=t(((e,t)=>{var n=W();function r(e){this.mode=n.NUMERIC,this.data=e.toString()}r.getBitsLength=function(e){return 10*Math.floor(e/3)+(e%3?e%3*3+1:0)},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(e){let t,n,r;for(t=0;t+3<=this.data.length;t+=3)n=this.data.substr(t,3),r=parseInt(n,10),e.put(r,10);let i=this.data.length-t;i>0&&(n=this.data.substr(t),r=parseInt(n,10),e.put(r,i*3+1))},t.exports=r})),K=t(((e,t)=>{var n=W(),r=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`.split(``);function i(e){this.mode=n.ALPHANUMERIC,this.data=e}i.getBitsLength=function(e){return 11*Math.floor(e/2)+e%2*6},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(e){let t;for(t=0;t+2<=this.data.length;t+=2){let n=r.indexOf(this.data[t])*45;n+=r.indexOf(this.data[t+1]),e.put(n,11)}this.data.length%2&&e.put(r.indexOf(this.data[t]),6)},t.exports=i})),q=t(((e,t)=>{var n=W();function r(e){this.mode=n.BYTE,typeof e==`string`?this.data=new TextEncoder().encode(e):this.data=new Uint8Array(e)}r.getBitsLength=function(e){return e*8},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(e){for(let t=0,n=this.data.length;t<n;t++)e.put(this.data[t],8)},t.exports=r})),J=t(((e,t)=>{var n=W(),r=j();function i(e){this.mode=n.KANJI,this.data=e}i.getBitsLength=function(e){return e*13},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(e){let t;for(t=0;t<this.data.length;t++){let n=r.toSJIS(this.data[t]);if(n>=33088&&n<=40956)n-=33088;else if(n>=57408&&n<=60351)n-=49472;else throw Error(`Invalid SJIS character: `+this.data[t]+`
|
|
3
|
+
Make sure your charset is UTF-8`);n=(n>>>8&255)*192+(n&255),e.put(n,13)}},t.exports=i})),Y=t(((e,t)=>{var n={single_source_shortest_paths:function(e,t,r){var i={},a={};a[t]=0;var o=n.PriorityQueue.make();o.push(t,0);for(var s,c,l,u,d,f,p,m,h;!o.empty();)for(l in s=o.pop(),c=s.value,u=s.cost,d=e[c]||{},d)d.hasOwnProperty(l)&&(f=d[l],p=u+f,m=a[l],h=a[l]===void 0,(h||m>p)&&(a[l]=p,o.push(l,p),i[l]=c));if(r!==void 0&&a[r]===void 0){var g=[`Could not find a path from `,t,` to `,r,`.`].join(``);throw Error(g)}return i},extract_shortest_path_from_predecessor_list:function(e,t){for(var n=[],r=t;r;)n.push(r),e[r],r=e[r];return n.reverse(),n},find_path:function(e,t,r){var i=n.single_source_shortest_paths(e,t,r);return n.extract_shortest_path_from_predecessor_list(i,r)},PriorityQueue:{make:function(e){var t=n.PriorityQueue,r={},i;for(i in e||={},t)t.hasOwnProperty(i)&&(r[i]=t[i]);return r.queue=[],r.sorter=e.sorter||t.default_sorter,r},default_sorter:function(e,t){return e.cost-t.cost},push:function(e,t){var n={value:e,cost:t};this.queue.push(n),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};t!==void 0&&(t.exports=n)})),ie=t((e=>{var t=W(),n=G(),r=K(),i=q(),a=J(),o=U(),s=j(),c=Y();function l(e){return unescape(encodeURIComponent(e)).length}function u(e,t,n){let r=[],i;for(;(i=e.exec(n))!==null;)r.push({data:i[0],index:i.index,mode:t,length:i[0].length});return r}function d(e){let n=u(o.NUMERIC,t.NUMERIC,e),r=u(o.ALPHANUMERIC,t.ALPHANUMERIC,e),i,a;return s.isKanjiModeEnabled()?(i=u(o.BYTE,t.BYTE,e),a=u(o.KANJI,t.KANJI,e)):(i=u(o.BYTE_KANJI,t.BYTE,e),a=[]),n.concat(r,i,a).sort(function(e,t){return e.index-t.index}).map(function(e){return{data:e.data,mode:e.mode,length:e.length}})}function f(e,o){switch(o){case t.NUMERIC:return n.getBitsLength(e);case t.ALPHANUMERIC:return r.getBitsLength(e);case t.KANJI:return a.getBitsLength(e);case t.BYTE:return i.getBitsLength(e)}}function p(e){return e.reduce(function(e,t){let n=e.length-1>=0?e[e.length-1]:null;return n&&n.mode===t.mode?(e[e.length-1].data+=t.data,e):(e.push(t),e)},[])}function m(e){let n=[];for(let r=0;r<e.length;r++){let i=e[r];switch(i.mode){case t.NUMERIC:n.push([i,{data:i.data,mode:t.ALPHANUMERIC,length:i.length},{data:i.data,mode:t.BYTE,length:i.length}]);break;case t.ALPHANUMERIC:n.push([i,{data:i.data,mode:t.BYTE,length:i.length}]);break;case t.KANJI:n.push([i,{data:i.data,mode:t.BYTE,length:l(i.data)}]);break;case t.BYTE:n.push([{data:i.data,mode:t.BYTE,length:l(i.data)}])}}return n}function h(e,n){let r={},i={start:{}},a=[`start`];for(let o=0;o<e.length;o++){let s=e[o],c=[];for(let e=0;e<s.length;e++){let l=s[e],u=``+o+e;c.push(u),r[u]={node:l,lastCount:0},i[u]={};for(let e=0;e<a.length;e++){let o=a[e];r[o]&&r[o].node.mode===l.mode?(i[o][u]=f(r[o].lastCount+l.length,l.mode)-f(r[o].lastCount,l.mode),r[o].lastCount+=l.length):(r[o]&&(r[o].lastCount=l.length),i[o][u]=f(l.length,l.mode)+4+t.getCharCountIndicator(l.mode,n))}}a=c}for(let e=0;e<a.length;e++)i[a[e]].end=0;return{map:i,table:r}}function g(e,o){let c,l=t.getBestModeForData(e);if(c=t.from(o,l),c!==t.BYTE&&c.bit<l.bit)throw Error(`"`+e+`" cannot be encoded with mode `+t.toString(c)+`.
|
|
4
|
+
Suggested mode is: `+t.toString(l));switch(c===t.KANJI&&!s.isKanjiModeEnabled()&&(c=t.BYTE),c){case t.NUMERIC:return new n(e);case t.ALPHANUMERIC:return new r(e);case t.KANJI:return new a(e);case t.BYTE:return new i(e)}}e.fromArray=function(e){return e.reduce(function(e,t){return typeof t==`string`?e.push(g(t,null)):t.data&&e.push(g(t.data,t.mode)),e},[])},e.fromString=function(t,n){let r=h(m(d(t,s.isKanjiModeEnabled())),n),i=c.find_path(r.map,`start`,`end`),a=[];for(let e=1;e<i.length-1;e++)a.push(r.table[i[e]].node);return e.fromArray(p(a))},e.rawSplit=function(t){return e.fromArray(d(t,s.isKanjiModeEnabled()))}})),ae=t((e=>{var t=j(),n=M(),r=N(),i=P(),a=F(),o=I(),s=L(),c=R(),l=V(),u=ne(),d=re(),f=W(),p=ie();function m(e,t){let n=e.size,r=o.getPositions(t);for(let t=0;t<r.length;t++){let i=r[t][0],a=r[t][1];for(let t=-1;t<=7;t++)if(!(i+t<=-1||n<=i+t))for(let r=-1;r<=7;r++)a+r<=-1||n<=a+r||(t>=0&&t<=6&&(r===0||r===6)||r>=0&&r<=6&&(t===0||t===6)||t>=2&&t<=4&&r>=2&&r<=4?e.set(i+t,a+r,!0,!0):e.set(i+t,a+r,!1,!0))}}function h(e){let t=e.size;for(let n=8;n<t-8;n++){let t=n%2==0;e.set(n,6,t,!0),e.set(6,n,t,!0)}}function g(e,t){let n=a.getPositions(t);for(let t=0;t<n.length;t++){let r=n[t][0],i=n[t][1];for(let t=-2;t<=2;t++)for(let n=-2;n<=2;n++)t===-2||t===2||n===-2||n===2||t===0&&n===0?e.set(r+t,i+n,!0,!0):e.set(r+t,i+n,!1,!0)}}function _(e,t){let n=e.size,r=u.getEncodedBits(t),i,a,o;for(let t=0;t<18;t++)i=Math.floor(t/3),a=t%3+n-8-3,o=(r>>t&1)==1,e.set(i,a,o,!0),e.set(a,i,o,!0)}function v(e,t,n){let r=e.size,i=d.getEncodedBits(t,n),a,o;for(a=0;a<15;a++)o=(i>>a&1)==1,a<6?e.set(a,8,o,!0):a<8?e.set(a+1,8,o,!0):e.set(r-15+a,8,o,!0),a<8?e.set(8,r-a-1,o,!0):a<9?e.set(8,15-a-1+1,o,!0):e.set(8,15-a-1,o,!0);e.set(r-8,8,1,!0)}function y(e,t){let n=e.size,r=-1,i=n-1,a=7,o=0;for(let s=n-1;s>0;s-=2)for(s===6&&s--;;){for(let n=0;n<2;n++)if(!e.isReserved(i,s-n)){let r=!1;o<t.length&&(r=(t[o]>>>a&1)==1),e.set(i,s-n,r),a--,a===-1&&(o++,a=7)}if(i+=r,i<0||n<=i){i-=r,r=-r;break}}}function b(e,n,i){let a=new r;i.forEach(function(t){a.put(t.mode.bit,4),a.put(t.getLength(),f.getCharCountIndicator(t.mode,e)),t.write(a)});let o=(t.getSymbolTotalCodewords(e)-c.getTotalCodewordsCount(e,n))*8;for(a.getLengthInBits()+4<=o&&a.put(0,4);a.getLengthInBits()%8!=0;)a.putBit(0);let s=(o-a.getLengthInBits())/8;for(let e=0;e<s;e++)a.put(e%2?17:236,8);return x(a,e,n)}function x(e,n,r){let i=t.getSymbolTotalCodewords(n),a=i-c.getTotalCodewordsCount(n,r),o=c.getBlocksCount(n,r),s=o-i%o,u=Math.floor(i/o),d=Math.floor(a/o),f=d+1,p=u-d,m=new l(p),h=0,g=Array(o),_=Array(o),v=0,y=new Uint8Array(e.buffer);for(let e=0;e<o;e++){let t=e<s?d:f;g[e]=y.slice(h,h+t),_[e]=m.encode(g[e]),h+=t,v=Math.max(v,t)}let b=new Uint8Array(i),x=0,S,C;for(S=0;S<v;S++)for(C=0;C<o;C++)S<g[C].length&&(b[x++]=g[C][S]);for(S=0;S<p;S++)for(C=0;C<o;C++)b[x++]=_[C][S];return b}function S(e,n,r,a){let o;if(Array.isArray(e))o=p.fromArray(e);else if(typeof e==`string`){let t=n;if(!t){let n=p.rawSplit(e);t=u.getBestVersionForData(n,r)}o=p.fromString(e,t||40)}else throw Error(`Invalid data`);let c=u.getBestVersionForData(o,r);if(!c)throw Error(`The amount of data is too big to be stored in a QR Code`);if(!n)n=c;else if(n<c)throw Error(`
|
|
5
|
+
The chosen QR Code version cannot contain this amount of data.
|
|
6
|
+
Minimum version required to store current data is: `+c+`.
|
|
7
|
+
`);let l=b(n,r,o),d=new i(t.getSymbolSize(n));return m(d,n),h(d),g(d,n),v(d,r,0),n>=7&&_(d,n),y(d,l),isNaN(a)&&(a=s.getBestMask(d,v.bind(null,d,r))),s.applyMask(a,d),v(d,r,a),{modules:d,version:n,errorCorrectionLevel:r,maskPattern:a,segments:o}}e.create=function(e,r){if(e===void 0||e===``)throw Error(`No input text`);let i=n.M,a,o;return r!==void 0&&(i=n.from(r.errorCorrectionLevel,n.M),a=u.from(r.version),o=s.from(r.maskPattern),r.toSJISFunc&&t.setToSJISFunction(r.toSJISFunc)),S(e,a,i,o)}})),X=t((e=>{function t(e){if(typeof e==`number`&&(e=e.toString()),typeof e!=`string`)throw Error(`Color should be defined as hex string`);let t=e.slice().replace(`#`,``).split(``);if(t.length<3||t.length===5||t.length>8)throw Error(`Invalid hex color: `+e);(t.length===3||t.length===4)&&(t=Array.prototype.concat.apply([],t.map(function(e){return[e,e]}))),t.length===6&&t.push(`F`,`F`);let n=parseInt(t.join(``),16);return{r:n>>24&255,g:n>>16&255,b:n>>8&255,a:n&255,hex:`#`+t.slice(0,6).join(``)}}e.getOptions=function(e){e||={},e.color||={};let n=e.margin===void 0||e.margin===null||e.margin<0?4:e.margin,r=e.width&&e.width>=21?e.width:void 0,i=e.scale||4;return{width:r,scale:r?4:i,margin:n,color:{dark:t(e.color.dark||`#000000ff`),light:t(e.color.light||`#ffffffff`)},type:e.type,rendererOpts:e.rendererOpts||{}}},e.getScale=function(e,t){return t.width&&t.width>=e+t.margin*2?t.width/(e+t.margin*2):t.scale},e.getImageWidth=function(t,n){let r=e.getScale(t,n);return Math.floor((t+n.margin*2)*r)},e.qrToImageData=function(t,n,r){let i=n.modules.size,a=n.modules.data,o=e.getScale(i,r),s=Math.floor((i+r.margin*2)*o),c=r.margin*o,l=[r.color.light,r.color.dark];for(let e=0;e<s;e++)for(let n=0;n<s;n++){let u=(e*s+n)*4,d=r.color.light;if(e>=c&&n>=c&&e<s-c&&n<s-c){let t=Math.floor((e-c)/o),r=Math.floor((n-c)/o);d=l[a[t*i+r]?1:0]}t[u++]=d.r,t[u++]=d.g,t[u++]=d.b,t[u]=d.a}}})),oe=t((e=>{var t=X();function n(e,t,n){e.clearRect(0,0,t.width,t.height),t.style||={},t.height=n,t.width=n,t.style.height=n+`px`,t.style.width=n+`px`}function r(){try{return document.createElement(`canvas`)}catch{throw Error(`You need to specify a canvas element`)}}e.render=function(e,i,a){let o=a,s=i;o===void 0&&(!i||!i.getContext)&&(o=i,i=void 0),i||(s=r()),o=t.getOptions(o);let c=t.getImageWidth(e.modules.size,o),l=s.getContext(`2d`),u=l.createImageData(c,c);return t.qrToImageData(u.data,e,o),n(l,s,c),l.putImageData(u,0,0),s},e.renderToDataURL=function(t,n,r){let i=r;i===void 0&&(!n||!n.getContext)&&(i=n,n=void 0),i||={};let a=e.render(t,n,i),o=i.type||`image/png`,s=i.rendererOpts||{};return a.toDataURL(o,s.quality)}})),se=t((e=>{var t=X();function n(e,t){let n=e.a/255,r=t+`="`+e.hex+`"`;return n<1?r+` `+t+`-opacity="`+n.toFixed(2).slice(1)+`"`:r}function r(e,t,n){let r=e+t;return n!==void 0&&(r+=` `+n),r}function i(e,t,n){let i=``,a=0,o=!1,s=0;for(let c=0;c<e.length;c++){let l=Math.floor(c%t),u=Math.floor(c/t);!l&&!o&&(o=!0),e[c]?(s++,c>0&&l>0&&e[c-1]||(i+=o?r(`M`,l+n,.5+u+n):r(`m`,a,0),a=0,o=!1),l+1<t&&e[c+1]||(i+=r(`h`,s),s=0)):a++}return i}e.render=function(e,r,a){let o=t.getOptions(r),s=e.modules.size,c=e.modules.data,l=s+o.margin*2,u=o.color.light.a?`<path `+n(o.color.light,`fill`)+` d="M0 0h`+l+`v`+l+`H0z"/>`:``,d=`<path `+n(o.color.dark,`stroke`)+` d="`+i(c,s,o.margin)+`"/>`,f=`viewBox="0 0 `+l+` `+l+`"`,p=`<svg xmlns="http://www.w3.org/2000/svg" `+(o.width?`width="`+o.width+`" height="`+o.width+`" `:``)+f+` shape-rendering="crispEdges">`+u+d+`</svg>
|
|
8
|
+
`;return typeof a==`function`&&a(null,p),p}})),ce=n(t((e=>{var t=A(),n=ae(),r=oe(),i=se();function a(e,r,i,a,o){let s=[].slice.call(arguments,1),c=s.length,l=typeof s[c-1]==`function`;if(!l&&!t())throw Error(`Callback required as last argument`);if(l){if(c<2)throw Error(`Too few arguments provided`);c===2?(o=i,i=r,r=a=void 0):c===3&&(r.getContext&&o===void 0?(o=a,a=void 0):(o=a,a=i,i=r,r=void 0))}else{if(c<1)throw Error(`Too few arguments provided`);return c===1?(i=r,r=a=void 0):c===2&&!r.getContext&&(a=i,i=r,r=void 0),new Promise(function(t,o){try{t(e(n.create(i,a),r,a))}catch(e){o(e)}})}try{let t=n.create(i,a);o(null,e(t,r,a))}catch(e){o(e)}}e.create=n.create,e.toCanvas=a.bind(null,r.render),e.toDataURL=a.bind(null,r.renderToDataURL),e.toString=a.bind(null,function(e,t,n){return i.render(e,n)})}))(),1),Z=n(a(),1);async function Q(e,t){try{let n=await fetch(e,t),r=n.headers.get(`content-type`);return r&&r.includes(`application/json`)?await n.json():await n.text()}catch(t){throw console.error(`API request failed for ${e}:`,t),t}}async function le(e){return Q(e)}var ue=750;function de(e){return new Promise((t,n)=>{let r=window.setTimeout(()=>{n(Error(`写入剪贴板超时`))},ue);navigator.clipboard.writeText(e).then(()=>{window.clearTimeout(r),t()},e=>{window.clearTimeout(r),n(e)})})}function fe(e,t){if(e?.focus(),!t)return;let n=window.getSelection();n?.removeAllRanges(),n?.addRange(t)}function pe(e){let t=document.activeElement instanceof HTMLElement?document.activeElement:null,n=window.getSelection(),r=n&&n.rangeCount>0?n.getRangeAt(0):null,i=document.createElement(`textarea`);i.value=e,i.readOnly=!0,i.setAttribute(`aria-hidden`,`true`),i.style.position=`fixed`,i.style.inset=`0 auto auto 0`,i.style.opacity=`0`,i.style.pointerEvents=`none`,document.body.appendChild(i),i.focus(),i.select(),i.setSelectionRange(0,e.length);try{if(!document.execCommand(`copy`))throw Error(`浏览器未允许复制到剪贴板`)}finally{i.remove(),fe(t,r)}}async function me(e){let t;if(typeof navigator<`u`&&`clipboard`in navigator)try{await de(e);return}catch(e){t=e}try{pe(e)}catch(e){throw Error(`浏览器未允许复制到剪贴板`,{cause:t||e})}}var $=e();function he(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.enabled==`boolean`&&typeof t.interceptHttps==`boolean`&&typeof t.authenticationRequired==`boolean`&&Array.isArray(t.targets)}function ge(){let[e,t]=(0,Z.useState)(null),[n,r]=(0,Z.useState)(``),[a,A]=(0,Z.useState)(``),[j,M]=(0,Z.useState)(!0),[N,P]=(0,Z.useState)(``),[F,I]=(0,Z.useState)(!1),[L,R]=(0,Z.useState)(``),z=(0,Z.useRef)(null),B=async()=>{M(!0),P(``);try{let e=await le(`/api/remote-access`);if(!he(e))throw Error(`手机代理接口不可用,请重启 Meddle 服务后重试`);t(e),r(t=>e.targets.some(e=>e.address===t)?t:e.targets[0]?.address||``)}catch(e){P(e instanceof Error?e.message:`无法读取远程代理状态`)}finally{M(!1)}};(0,Z.useEffect)(()=>{B()},[]),(0,Z.useEffect)(()=>{L&&(z.current?.focus(),z.current?.select())},[L]);let V=(0,Z.useMemo)(()=>e?.targets.find(e=>e.address===n)||e?.targets[0]||null,[e,n]);(0,Z.useEffect)(()=>{let e=!1;if(!V){A(``);return}return ce.toDataURL(V.setupUrl,{width:320,margin:2,errorCorrectionLevel:`M`,color:{dark:`#111827`,light:`#ffffff`}}).then(t=>{e||A(t)}).catch(t=>{e||P(t instanceof Error?t.message:`二维码生成失败`)}),()=>{e=!0}},[V]);let H=async()=>{if(V)try{await me(V.setupUrl),I(!0),R(``),w.success(`手机配置地址已复制`),window.setTimeout(()=>I(!1),1500)}catch{R(V.setupUrl),w.info(`浏览器禁止自动复制,地址已选中`)}};return j?(0,$.jsxs)(`div`,{className:`grid h-full gap-6 p-6 md:grid-cols-[340px_1fr]`,"aria-label":`正在读取手机代理状态`,children:[(0,$.jsx)(y,{className:`min-h-[420px] w-full`}),(0,$.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,$.jsx)(y,{className:`h-8 w-40`}),(0,$.jsx)(y,{className:`h-20 w-full`}),(0,$.jsx)(y,{className:`h-10 w-full`})]})]}):N&&!e?(0,$.jsx)(`div`,{className:`p-6`,children:(0,$.jsxs)(O,{variant:`destructive`,children:[(0,$.jsx)(D,{children:`加载失败`}),(0,$.jsx)(E,{children:N})]})}):e?.enabled?V?(0,$.jsx)(`div`,{className:`app-panel-content h-full`,children:(0,$.jsxs)(`div`,{className:`mx-auto grid w-full max-w-3xl gap-6 md:grid-cols-[340px_1fr]`,children:[(0,$.jsxs)(m,{className:`gap-0 overflow-hidden py-0 shadow-none`,children:[(0,$.jsxs)(p,{className:`border-b py-4`,children:[(0,$.jsxs)(v,{className:`flex items-center gap-2`,children:[(0,$.jsx)(C,{}),`扫码打开配置页`]}),(0,$.jsx)(f,{children:`使用手机相机或 Safari 扫描。`}),(0,$.jsx)(h,{children:(0,$.jsx)(T,{variant:`secondary`,children:`局域网`})})]}),(0,$.jsx)(_,{className:`flex min-h-[340px] items-center justify-center bg-background p-4`,children:a?(0,$.jsx)(`img`,{src:a,alt:`打开 ${V.setupUrl} 的二维码`,className:`size-[300px] rounded-lg`}):(0,$.jsx)(S,{className:`size-6 animate-spin text-muted-foreground`})})]}),(0,$.jsxs)(m,{className:`gap-0 py-0 shadow-none`,children:[(0,$.jsxs)(p,{className:`border-b py-4`,children:[(0,$.jsxs)(v,{className:`flex items-center gap-2`,children:[(0,$.jsx)(l,{}),`手机代理配置`]}),(0,$.jsx)(f,{children:`手机与电脑连接同一局域网后,扫描二维码打开配置页并安装 HTTPS 根证书。`})]}),(0,$.jsxs)(_,{className:`flex flex-col gap-5 p-5`,children:[(0,$.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,$.jsxs)(`div`,{className:`inline-flex items-center gap-1`,children:[(0,$.jsxs)(T,{variant:`outline`,className:`gap-1.5`,children:[(0,$.jsx)(u,{}),V.address,`:`,e.proxyPort]}),(0,$.jsx)(i,{variant:`ghost`,size:`icon-sm`,onClick:()=>void H(),"aria-label":F?`地址已复制`:`复制手机配置地址`,title:F?`已复制`:`复制地址`,className:`size-6`,children:F?(0,$.jsx)(x,{}):(0,$.jsx)(o,{})})]}),(0,$.jsxs)(T,{variant:e.interceptHttps?`default`:`secondary`,className:`gap-1.5`,children:[e.interceptHttps?(0,$.jsx)(c,{}):(0,$.jsx)(k,{}),`HTTPS `,e.interceptHttps?`解密开启`:`解密关闭`]}),e.authenticationRequired&&(0,$.jsx)(T,{variant:`secondary`,children:`需要代理认证`})]}),L&&(0,$.jsxs)(`div`,{className:`flex flex-col gap-2 rounded-lg border bg-muted/40 p-3 text-xs text-muted-foreground`,role:`status`,children:[(0,$.jsx)(`span`,{children:`浏览器禁止自动访问剪贴板,请按 Ctrl/Cmd+C 复制:`}),(0,$.jsx)(d,{ref:z,value:L,readOnly:!0,"aria-label":`手动复制手机配置地址`,onFocus:e=>e.currentTarget.select(),onClick:e=>e.currentTarget.select()})]}),e.targets.length>1&&(0,$.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,$.jsx)(`div`,{className:`text-xs font-medium text-muted-foreground`,children:`选择局域网地址`}),(0,$.jsx)(g,{type:`single`,value:V.address,onValueChange:e=>{e&&(r(e),R(``))},variant:`outline`,size:`sm`,spacing:1,className:`flex-wrap justify-start`,"aria-label":`局域网地址`,children:e.targets.map(e=>(0,$.jsx)(b,{value:e.address,children:e.address},e.address))})]}),(0,$.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,$.jsx)(i,{variant:`outline`,size:`sm`,asChild:!0,children:(0,$.jsxs)(`a`,{href:V.setupUrl,target:`_blank`,rel:`noreferrer`,children:[(0,$.jsx)(ee,{"data-icon":`inline-start`}),`浏览器打开`]})}),e.interceptHttps&&(0,$.jsx)(i,{variant:`outline`,size:`sm`,asChild:!0,children:(0,$.jsxs)(`a`,{href:V.certificateUrl,children:[(0,$.jsx)(te,{"data-icon":`inline-start`}),`下载根证书`]})})]}),(0,$.jsxs)(`ol`,{className:`flex flex-col gap-2 text-sm leading-6 text-muted-foreground`,children:[(0,$.jsx)(`li`,{children:`1. 扫码打开手机配置页。`}),(0,$.jsx)(`li`,{children:`2. 在手机 Wi-Fi 设置中填写页面显示的代理地址。`}),(0,$.jsx)(`li`,{children:`3. 安装并完全信任根证书后,即可查看 HTTPS 请求。`})]}),N&&(0,$.jsxs)(O,{variant:`destructive`,children:[(0,$.jsx)(D,{children:`操作失败`}),(0,$.jsx)(E,{children:N})]})]})]})]})}):(0,$.jsxs)(`div`,{className:`flex flex-col gap-4 p-6`,children:[(0,$.jsxs)(O,{variant:`destructive`,children:[(0,$.jsx)(u,{}),(0,$.jsx)(D,{children:`未发现局域网地址`}),(0,$.jsx)(E,{children:`请确认电脑已连接 Wi-Fi 或有线局域网,然后重新检测。`})]}),(0,$.jsxs)(i,{variant:`outline`,size:`sm`,onClick:()=>void B(),children:[(0,$.jsx)(s,{"data-icon":`inline-start`}),`重新检测`]})]}):(0,$.jsxs)(`div`,{className:`flex flex-col gap-4 p-6`,children:[(0,$.jsxs)(O,{children:[(0,$.jsx)(k,{}),(0,$.jsx)(D,{children:`远程代理尚未开启`}),(0,$.jsxs)(E,{children:[`使用 `,(0,$.jsx)(`code`,{className:`rounded bg-muted px-1.5 py-0.5`,children:`meddle --remote`}),` 重启代理后,即可显示手机扫码入口。`]})]}),(0,$.jsxs)(i,{variant:`outline`,size:`sm`,onClick:()=>void B(),children:[(0,$.jsx)(s,{"data-icon":`inline-start`}),`重新检测`]})]})}export{ge as MobileProxyPanel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as ee}from"./chevron-down-CPngAx4M.js";import{t as te}from"./chevron-right-V1DGIDbL.js";import{t as a}from"./code-5_eJ_XpJ.js";import{n as ne,t as o}from"./checkbox-DIBarrJx.js";import{t as s}from"./plus-tVxSydJ8.js";import{t as re}from"./wand-sparkles-wkul5vje.js";import"./es2015-CfXu88Y7.js";import{o as ie,r as ae}from"./ai-config-store-DQXVJVn_.js";import{A as c,G as l,d as oe,f as se,g as ce,h as le,lt as ue,m as u,p as de,rt as fe,u as d,v as pe,y as me,z as f}from"./index-L7uWxTnp.js";import{r as p}from"./syntax-highlight-DVhPdkuV.js";import{a as he,i as m,n as ge,o as h,r as g,t as _}from"./table-CT97lAYq.js";import{n as _e}from"./monaco-editor-B3brLg8j.js";import{n as ve,t as ye}from"./code-fixer-fQtWZ5He.js";import{t as v}from"./file-system-access-CtcvBfj4.js";var y=n(`file-up`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M12 12v6`,key:`3ahymv`}],[`path`,{d:`m15 15-3-3-3 3`,key:`15xj92`}]]),b=t(i(),1),x=e();function be(e){return e.trim().startsWith(`data:image/`)}var xe={name:``,urlPattern:``,method:`*`,statusCode:200,delay:0,bodyType:`inline`,headers:{},body:``,enabled:!0};function S({mockRules:e,fetchMocks:t,createMock:n,updateMock:i,deleteMock:S,initialEditData:C,onInitialEditConsumed:w}){let[T,E]=(0,b.useState)(!1),[D]=(0,b.useState)(null),[O,Se]=(0,b.useState)(xe),[k,A]=(0,b.useState)(!1),[j,M]=(0,b.useState)(!1),[N,Ce]=(0,b.useState)(300),we=(0,b.useRef)(null),P=(0,b.useRef)(null),[F,I]=(0,b.useState)(``),[L,R]=(0,b.useState)(``),[z,B]=(0,b.useState)(null),[V,H]=(0,b.useState)(null),[U,W]=(0,b.useState)(!1),[G,K]=(0,b.useState)(!1),[q,J]=(0,b.useState)(null),Te=e=>e.type.startsWith(`image/`),Ee=e=>({json:`application/json`,js:`application/javascript`,css:`text/css`,html:`text/html`,htm:`text/html`,xml:`application/xml`,txt:`text/plain`,csv:`text/csv`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`,webp:`image/webp`,svg:`image/svg+xml`,ico:`image/x-icon`,bmp:`image/bmp`})[e.toLowerCase().split(`.`).pop()||``]||`text/plain`,Y=e=>{let t=Ee(e);return(O.headers||{})[`Content-Type`]?null:t},X=async e=>Te(e)?new Promise(t=>{let n=new FileReader;n.onload=e=>{t(e.target?.result)},n.readAsDataURL(e)}):await e.text(),De=(0,b.useCallback)(async()=>{if(v(window))try{let[e]=await window.showOpenFilePicker({types:[{description:`响应文件`,accept:{"application/json":[`.json`],"text/html":[`.html`,`.htm`],"text/plain":[`.txt`,`.js`,`.css`,`.xml`,`.csv`,`.png`,`.jpg`,`.jpeg`,`.gif`,`.webp`],"image/png":[`.png`],"image/jpeg":[`.jpg`,`.jpeg`],"image/gif":[`.gif`],"image/webp":[`.webp`]}}],multiple:!1}),t=await e.getFile();$(`body`,await X(t)),J(Y(t.name));return}catch(e){console.log(`File System Access API not available or cancelled:`,e)}P.current?.click()},[]),Oe=(0,b.useCallback)(e=>{let t=e.target.files?.[0];t&&X(t).then(e=>{$(`body`,e),J(Y(t.name))}),e.target.value=``},[]);(0,b.useEffect)(()=>{t()},[t]),(0,b.useEffect)(()=>{C&&(window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.create`,title:`新建 Mock 规则`,size:`lg`,params:{initialData:C}}})),w?.())},[C,w]),(0,b.useEffect)(()=>{T||(I(``),R(``),M(!1),H(null),B(null))},[T]);let ke=(0,b.useCallback)(e=>{if(!e.trim()){H(null);return}let t=p(e);t.valid?H(null):H(t.error||`内容格式错误`)},[]),Z=(0,b.useCallback)(()=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.create`,title:`新建 Mock 规则`,size:`lg`}}))},[]),Ae=(0,b.useCallback)(e=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.edit`,title:`编辑 Mock:${e.name||e.urlPattern}`,size:`lg`,params:{id:e.id}}}))},[]),je=(0,b.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=N,r=e=>{let r=e.clientY-t;Ce(Math.max(150,n+r))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[N]),Q=(0,b.useCallback)(async()=>{if(O.bodyType===`inline`&&O.body.trim()){let e=p(O.body);if(!e.valid){let t=e.error||`内容格式错误`;H(t),d.error(t);return}}A(!0);try{if(!(D==null?await n(O):await i(D,O)))throw Error(`保存 Mock 规则失败`);d.success(`Mock 规则保存成功`),E(!1)}catch(e){d.error(e instanceof Error?e.message:`保存失败`)}finally{A(!1)}},[D,O,n,i]);oe({active:T,enabled:!k&&!!O.urlPattern,priority:se.modal,onSave:Q});let Me=(0,b.useCallback)(async(e,t)=>{await i(e.id,{enabled:t})},[i]),Ne=(0,b.useCallback)(async e=>{await S(e)},[S]),$=(e,t)=>{Se(n=>({...n,[e]:t})),e===`body`&&typeof t==`string`&&ke(t)},Pe=(0,b.useCallback)(async()=>{K(!0);try{let{formatted:e,type:t}=await ve(O.body);$(`body`,e),B(null),console.log(`已格式化为 ${t}`)}catch(e){B(e instanceof Error?e.message:`格式化失败`),setTimeout(()=>B(null),3e3)}finally{K(!1)}},[O.body]),Fe=(0,b.useCallback)(async()=>{W(!0);try{let e=await ye(O.body,!0);e.success?($(`body`,e.fixed),H(null),B(null),console.log(`代码已修复 (方法: ${e.method===`ai`?`AI`:`规则`})`)):(B(`自动修复失败,请手动修正语法错误`),setTimeout(()=>B(null),3e3))}catch(e){B(e instanceof Error?e.message:`修复失败`),setTimeout(()=>B(null),3e3)}finally{W(!1)}},[O.body]);return(0,x.jsxs)(`div`,{className:`app-page-stack`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsx)(`h3`,{className:`text-sm font-medium`,children:`规则列表`}),(0,x.jsxs)(r,{variant:`outline`,size:`sm`,onClick:Z,children:[(0,x.jsx)(s,{"data-icon":`inline-start`}),`新增规则`]})]}),(0,x.jsx)(`div`,{className:`rounded-md border`,children:(0,x.jsxs)(_,{children:[(0,x.jsx)(he,{children:(0,x.jsxs)(h,{children:[(0,x.jsx)(m,{className:`w-12`,children:`启用`}),(0,x.jsx)(m,{className:`w-40`,children:`名称`}),(0,x.jsx)(m,{children:`URL 匹配`}),(0,x.jsx)(m,{className:`w-20`,children:`方法`}),(0,x.jsx)(m,{className:`w-20`,children:`状态码`}),(0,x.jsx)(m,{className:`w-16`,children:`类型`}),(0,x.jsx)(m,{className:`w-16`,children:`延迟`}),(0,x.jsx)(m,{className:`w-16`,children:`响应头`}),(0,x.jsx)(m,{className:`w-20`,children:`操作`})]})}),(0,x.jsx)(ge,{children:e.length===0?(0,x.jsx)(h,{children:(0,x.jsx)(g,{colSpan:9,className:`text-center text-muted-foreground py-8`,children:`暂无 Mock 规则,点击"新增规则"或从请求日志详情中创建`})}):e.map(e=>(0,x.jsxs)(h,{children:[(0,x.jsx)(g,{children:(0,x.jsx)(o,{checked:e.enabled,onCheckedChange:t=>Me(e,t===!0)})}),(0,x.jsx)(g,{className:`font-medium text-sm`,children:e.name||(0,x.jsx)(`span`,{className:`text-muted-foreground italic`,children:`未命名`})}),(0,x.jsx)(g,{className:`font-mono text-xs truncate max-w-[300px]`,title:e.urlPattern,children:e.urlPattern}),(0,x.jsx)(g,{children:(0,x.jsx)(f,{variant:`outline`,className:`text-xs`,children:e.method||`*`})}),(0,x.jsx)(g,{children:(0,x.jsx)(f,{variant:e.statusCode>=400?`destructive`:e.statusCode>=300?`secondary`:`default`,children:e.statusCode})}),(0,x.jsx)(g,{children:e.bodyType===`file`?(0,x.jsxs)(f,{variant:`secondary`,children:[(0,x.jsx)(ue,{}),`文件`]}):(0,x.jsxs)(f,{variant:`outline`,children:[(0,x.jsx)(a,{}),`内容`]})}),(0,x.jsx)(g,{className:`text-xs text-muted-foreground font-mono`,children:e.delay?`${e.delay}ms`:`-`}),(0,x.jsx)(g,{children:e.headers&&Object.keys(e.headers).length>0?(0,x.jsx)(f,{variant:`secondary`,className:`text-xs`,children:Object.keys(e.headers).length}):(0,x.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`-`})}),(0,x.jsx)(g,{children:(0,x.jsxs)(`div`,{className:`flex gap-1`,children:[(0,x.jsx)(r,{variant:`ghost`,size:`icon-sm`,onClick:()=>Ae(e),className:`text-muted-foreground hover:text-primary`,"aria-label":`编辑 Mock 规则`,children:(0,x.jsx)(fe,{})}),(0,x.jsx)(r,{variant:`ghost`,size:`icon-sm`,onClick:()=>Ne(e.id),className:`text-muted-foreground hover:text-destructive`,"aria-label":`删除 Mock 规则`,children:(0,x.jsx)(l,{})})]})})]},e.id))})]})}),(0,x.jsx)(le,{open:T,onOpenChange:E,children:(0,x.jsxs)(ce,{className:`p-0 flex flex-col`,resizable:!0,defaultWidth:700,storageKey:`mock-config-editor`,children:[(0,x.jsx)(pe,{className:`px-4 pt-4 pb-2`,children:(0,x.jsx)(me,{className:`text-base`,children:D==null?`新建 Mock 规则`:`编辑 Mock 规则`})}),(0,x.jsx)(u,{}),(0,x.jsxs)(`div`,{className:`app-panel-content`,children:[(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`规则名称`}),(0,x.jsx)(c,{value:O.name,onChange:e=>$(`name`,e.target.value),placeholder:`如:模拟欠费状态`,className:`h-8`})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`URL 匹配(支持正则)`}),(0,x.jsx)(c,{value:O.urlPattern,onChange:e=>$(`urlPattern`,e.target.value),placeholder:`如:/api/console/user/corp/.*`,className:`h-8 font-mono text-sm`})]}),(0,x.jsxs)(`div`,{className:`grid grid-cols-3 gap-3`,children:[(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`HTTP 方法`}),(0,x.jsxs)(`select`,{value:O.method,onChange:e=>$(`method`,e.target.value),className:`flex h-8 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm`,children:[(0,x.jsx)(`option`,{value:`*`,children:`全部`}),(0,x.jsx)(`option`,{value:`GET`,children:`GET`}),(0,x.jsx)(`option`,{value:`POST`,children:`POST`}),(0,x.jsx)(`option`,{value:`PUT`,children:`PUT`}),(0,x.jsx)(`option`,{value:`DELETE`,children:`DELETE`}),(0,x.jsx)(`option`,{value:`PATCH`,children:`PATCH`})]})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应状态码`}),(0,x.jsx)(c,{type:`number`,value:O.statusCode,onChange:e=>$(`statusCode`,parseInt(e.target.value)||200),className:`h-8`})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应延迟 (ms)`}),(0,x.jsx)(c,{type:`number`,value:O.delay,onChange:e=>$(`delay`,parseInt(e.target.value)||0),placeholder:`0`,className:`h-8`})]})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应内容 (Body)`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:De,children:[(0,x.jsx)(y,{className:`h-3 w-3 mr-1`}),`从文件加载`]}),(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:async()=>{let e=window.prompt(`请输入文件 URL:`);if(e)try{let t=await fetch(e);if((t.headers.get(`content-type`)||``).startsWith(`image/`)||e.match(/\.(png|jpg|jpeg|gif|webp|svg|ico|bmp)$/i)){let e=await t.blob(),n=new FileReader;n.onload=()=>{$(`body`,n.result)},n.readAsDataURL(e)}else $(`body`,await t.text())}catch(e){alert(`无法加载文件: `+e.message)}},children:[(0,x.jsx)(y,{className:`h-3 w-3 mr-1`}),`从URL导入`]}),z&&(0,x.jsx)(`span`,{className:`text-xs text-red-500`,children:z}),O.body.trim()&&ie(ae())&&(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:Fe,disabled:U,children:[(0,x.jsx)(re,{className:`h-3 w-3 mr-1`}),U?`修复中...`:`AI修复`]}),(0,x.jsxs)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:Pe,disabled:G,children:[(0,x.jsx)(a,{className:`h-3 w-3 mr-1`}),G?`格式化中...`:`智能格式化`]})]})]}),(0,x.jsx)(`input`,{ref:P,type:`file`,className:`hidden`,onChange:Oe,accept:`image/*,.json,.html,.htm,.txt,.js,.css,.xml,.csv`}),O.body.trim()&&be(O.body)?(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(`div`,{className:`border rounded-md p-2 bg-muted/30`,children:(0,x.jsx)(`img`,{src:O.body,alt:`Preview`,className:`max-w-full max-h-96 object-contain`})}),(0,x.jsxs)(`div`,{className:`flex gap-2`,children:[(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:()=>$(`body`,``),children:`删除图片`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:()=>{navigator.clipboard.writeText(O.body),alert(`图片内容已复制到剪贴板`)},children:`复制内容`})]})]}):(0,x.jsxs)(`div`,{ref:we,className:`relative group`,children:[(0,x.jsx)(_e,{value:O.body,onChange:e=>$(`body`,e),placeholder:`支持 JSON, HTML, JS, CSS 等格式,或从文件/URL导入`,height:`${N}px`}),(0,x.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 h-4 cursor-ns-resize flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity bg-gradient-to-t from-border/50 to-transparent`,onMouseDown:je,children:(0,x.jsx)(ne,{className:`h-4 w-4 text-muted-foreground`})})]}),V&&(0,x.jsxs)(`div`,{className:`flex items-start gap-2 p-2 rounded-md bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-900`,children:[(0,x.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 font-medium`,children:`语法错误:`}),(0,x.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 flex-1`,children:V})]})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsxs)(`button`,{type:`button`,className:`flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground`,onClick:()=>M(!j),children:[j?(0,x.jsx)(ee,{className:`h-3 w-3`}):(0,x.jsx)(te,{className:`h-3 w-3`}),`响应头 (Headers)`,Object.keys(O.headers||{}).length>0&&(0,x.jsx)(f,{variant:`secondary`,className:`ml-1 text-xs`,children:Object.keys(O.headers||{}).length})]}),q&&(0,x.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,x.jsxs)(`span`,{className:`text-amber-600 dark:text-amber-400`,children:[`检测到内容类型变更,建议更新为 `,q,`?`]}),(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:()=>{$(`headers`,{...O.headers||{},"Content-Type":q}),J(null)},children:`更新`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:()=>J(null),children:`忽略`})]})]}),j&&(0,x.jsxs)(`div`,{className:`space-y-2 pl-4 border-l-2 border-muted`,children:[Object.entries(O.headers||{}).length>0?(0,x.jsx)(`div`,{className:`space-y-1`,children:Object.entries(O.headers||{}).map(([e,t])=>(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(c,{value:e,onChange:n=>{let r={...O.headers};delete r[e],n.target.value&&(r[n.target.value]=t),$(`headers`,r)},placeholder:`Header 名称`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(c,{value:t,onChange:t=>{$(`headers`,{...O.headers,[e]:t.target.value})},placeholder:`Header 值`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-7 w-7 p-0 text-muted-foreground hover:text-destructive`,onClick:()=>{let t={...O.headers};delete t[e],$(`headers`,t)},children:(0,x.jsx)(l,{className:`h-3.5 w-3.5`})})]},e))}):(0,x.jsx)(`p`,{className:`text-xs text-muted-foreground italic`,children:`暂无自定义响应头`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(c,{value:F,onChange:e=>I(e.target.value),placeholder:`Header 名称`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(c,{value:L,onChange:e=>R(e.target.value),placeholder:`Header 值`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-7`,onClick:()=>{F&&L&&($(`headers`,{...O.headers,[F]:L}),I(``),R(``))},disabled:!F||!L,children:(0,x.jsx)(s,{className:`h-3.5 w-3.5`})})]})]})]}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(o,{checked:O.enabled,onCheckedChange:e=>$(`enabled`,!!e)}),(0,x.jsx)(`label`,{className:`text-sm`,children:`启用此规则`})]})]}),(0,x.jsx)(u,{}),(0,x.jsxs)(`div`,{className:`px-4 py-3 flex justify-end gap-2`,children:[(0,x.jsx)(r,{variant:`outline`,size:`sm`,onClick:()=>E(!1),children:`取消`}),(0,x.jsx)(de,{size:`sm`,onClick:Q,disabled:k||!O.urlPattern,children:k?`保存中...`:`保存`})]})]})})]})}export{S as MockConfig};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,f as t,t as n,u as r}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as i}from"./code-5_eJ_XpJ.js";import{n as a,t as o}from"./checkbox-DIBarrJx.js";import{t as s}from"./wand-sparkles-wkul5vje.js";import{o as c,r as l}from"./ai-config-store-DQXVJVn_.js";import{$ as u,A as d,b as f,d as p,f as m,m as h,ot as g,p as _,u as v}from"./index-L7uWxTnp.js";import{r as y}from"./syntax-highlight-DVhPdkuV.js";import{n as b}from"./monaco-editor-B3brLg8j.js";import{n as x,t as S}from"./code-fixer-fQtWZ5He.js";import{t as C}from"./textarea-C6NooVK1.js";var w=t(r(),1),T=e(),E={name:``,urlPattern:``,method:`*`,statusCode:200,delay:0,bodyType:`inline`,headers:{},body:``,enabled:!0};function D({rule:e,initialData:t,createMock:r,updateMock:D,onSaved:O}){let k=(0,w.useMemo)(()=>e?{name:e.name,urlPattern:e.urlPattern,method:e.method,statusCode:e.statusCode,delay:e.delay||0,bodyType:e.bodyType||`inline`,headers:e.headers||{},body:e.body,enabled:e.enabled}:{...E,...t},[t,e]),[A,j]=(0,w.useState)(k),[M,ee]=(0,w.useState)(()=>JSON.stringify(k.headers||{},null,2)),[N,P]=(0,w.useState)(!1),[F,I]=(0,w.useState)(null),[L,R]=(0,w.useState)(null),[z,B]=(0,w.useState)(null),[V,H]=(0,w.useState)(!1),[U,W]=(0,w.useState)(!1),[G,K]=(0,w.useState)(300),q=c(l()),J=(0,w.useCallback)(e=>{if(!e.trim()){B(null);return}let t=y(e);B(t.valid?null:t.error||`内容格式错误`)},[]),Y=(e,t)=>{j(n=>({...n,[e]:t})),e===`body`&&typeof t==`string`&&J(t)},X=(0,w.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=G,r=e=>{let r=e.clientY-t;K(Math.max(150,n+r))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[G]),Z=async()=>{if(!(!A.body.trim()||U)){W(!0),R(null);try{let{formatted:e}=await x(A.body);Y(`body`,e)}catch(e){R(e instanceof Error?e.message:`格式化失败`),window.setTimeout(()=>R(null),3e3)}finally{W(!1)}}},Q=async()=>{if(!(!A.body.trim()||V||!q)){H(!0),R(null);try{let e=await S(A.body,!0);if(!e.success)throw Error(`自动修复失败,请手动修正语法错误`);Y(`body`,e.fixed),B(null)}catch(e){R(e instanceof Error?e.message:`修复失败`),window.setTimeout(()=>R(null),3e3)}finally{H(!1)}}},$=async()=>{if(!A.urlPattern.trim()){I(`请填写 URL 匹配`);return}if(A.bodyType===`inline`&&A.body.trim()){let e=y(A.body);if(!e.valid){B(e.error||`内容格式错误`);return}}P(!0),I(null);try{let t={};if(M.trim()){let e=JSON.parse(M);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`响应头必须是 JSON 对象`);t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}let n={...A,headers:t},i=!1;if(i=e?await D(e.id,n):!!await r(n),!i)throw Error(`保存 Mock 规则失败`);v.success(e?`Mock 规则已更新`:`Mock 规则已创建`),O?.()}catch(e){let t=e instanceof Error?e.message:`保存失败`;I(t),v.error(t)}finally{P(!1)}};return p({active:!0,enabled:!N&&!!A.urlPattern.trim(),priority:m.panel,onSave:$}),(0,T.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,T.jsxs)(`div`,{className:`app-panel-content`,children:[F&&(0,T.jsx)(`div`,{className:`rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/20 dark:text-red-300`,children:F}),(0,T.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`规则名称`}),(0,T.jsx)(d,{value:A.name,onChange:e=>Y(`name`,e.target.value),placeholder:`如:模拟欠费状态`})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`HTTP 方法`}),(0,T.jsxs)(`select`,{value:A.method,onChange:e=>Y(`method`,e.target.value),className:`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm`,children:[(0,T.jsx)(`option`,{value:`*`,children:`全部`}),(0,T.jsx)(`option`,{value:`GET`,children:`GET`}),(0,T.jsx)(`option`,{value:`POST`,children:`POST`}),(0,T.jsx)(`option`,{value:`PUT`,children:`PUT`}),(0,T.jsx)(`option`,{value:`DELETE`,children:`DELETE`}),(0,T.jsx)(`option`,{value:`PATCH`,children:`PATCH`})]})]})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`URL 匹配(支持正则)`}),(0,T.jsx)(d,{value:A.urlPattern,onChange:e=>Y(`urlPattern`,e.target.value),placeholder:`如:/api/console/user/corp/.*`,className:`font-mono`})]}),(0,T.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`响应状态码`}),(0,T.jsx)(d,{type:`number`,value:A.statusCode,onChange:e=>Y(`statusCode`,parseInt(e.target.value)||200)})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`响应延迟 (ms)`}),(0,T.jsx)(d,{type:`number`,value:A.delay,onChange:e=>Y(`delay`,parseInt(e.target.value)||0)})]})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`响应头 JSON`}),(0,T.jsx)(C,{value:M,onChange:e=>ee(e.target.value),className:`min-h-[96px] font-mono text-xs`,placeholder:`{"Content-Type":"application/json"}`})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,T.jsx)(f,{children:`响应内容`}),(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center justify-end gap-2`,children:[L&&(0,T.jsx)(`span`,{className:`max-w-[280px] truncate text-xs text-red-500`,title:L,children:L}),A.body.trim()&&(0,T.jsxs)(n,{type:`button`,variant:`outline`,size:`sm`,className:`h-7 text-xs`,onClick:Q,disabled:V||!q,title:q?`使用 AI 修复响应内容`:`AI 未配置或未启用`,children:[V?(0,T.jsx)(g,{className:`mr-1 h-3 w-3 animate-spin`}):(0,T.jsx)(s,{className:`mr-1 h-3 w-3`}),V?`修复中...`:`AI修复`]}),(0,T.jsxs)(n,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 text-xs`,onClick:Z,disabled:U||!A.body.trim(),title:`格式化响应内容`,children:[U?(0,T.jsx)(g,{className:`mr-1 h-3 w-3 animate-spin`}):(0,T.jsx)(i,{className:`mr-1 h-3 w-3`}),U?`格式化中...`:`代码格式化`]})]})]}),(0,T.jsxs)(`div`,{className:`relative group`,style:{height:`${G}px`},children:[(0,T.jsx)(b,{value:A.body,onChange:e=>Y(`body`,e),placeholder:`支持 JSON、HTML、JS、CSS 等响应内容`,height:`flex`}),(0,T.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 h-4 cursor-ns-resize flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity bg-gradient-to-t from-border/50 to-transparent`,onMouseDown:X,children:(0,T.jsx)(a,{className:`h-4 w-4 text-muted-foreground`})})]}),z&&(0,T.jsxs)(`div`,{className:`flex items-start gap-2 p-2 rounded-md bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-900`,children:[(0,T.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 font-medium`,children:`语法错误:`}),(0,T.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 flex-1`,children:z})]})]}),(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(o,{checked:A.enabled,onCheckedChange:e=>Y(`enabled`,!!e)}),(0,T.jsx)(f,{className:`text-sm`,children:`启用此规则`})]})]}),(0,T.jsx)(h,{}),(0,T.jsx)(`div`,{className:`flex justify-end gap-2 px-5 py-3`,children:(0,T.jsxs)(_,{onClick:$,disabled:N||!A.urlPattern.trim(),children:[N?(0,T.jsx)(g,{"data-icon":`inline-start`,className:`animate-spin`}):(0,T.jsx)(u,{"data-icon":`inline-start`}),N?`保存中...`:`保存`]})})]})}export{D as MockEditorPanel};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{a as e,f as t,u as n}from"./button-BTToMaBW.js";import{o as r}from"./index-L7uWxTnp.js";function i(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function a(e){if(Array.isArray(e))return e}function o(e,t,n){return(t=h(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t!==0)for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function c(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
2
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function u(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?l(Object(n),!0).forEach(function(t){o(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function d(e,t){if(e==null)return{};var n,r,i=f(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function f(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function p(e,t){return a(e)||s(e,t)||g(e,t)||c()}function m(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function h(e){var t=m(e,`string`);return typeof t==`symbol`?t:t+``}function g(e,t){if(e){if(typeof e==`string`)return i(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?i(e,t):void 0}}function _(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function v(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function y(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?v(Object(n),!0).forEach(function(t){_(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):v(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function b(){var e=[...arguments];return function(t){return e.reduceRight(function(e,t){return t(e)},t)}}function x(e){return function t(){var n=this,r=[...arguments];return r.length>=e.length?e.apply(this,r):function(){var e=[...arguments];return t.apply(n,[].concat(r,e))}}}function S(e){return{}.toString.call(e).includes(`Object`)}function C(e){return!Object.keys(e).length}function w(e){return typeof e==`function`}function T(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function E(e,t){return S(t)||j(`changeType`),Object.keys(t).some(function(t){return!T(e,t)})&&j(`changeField`),t}function D(e){w(e)||j(`selectorType`)}function O(e){w(e)||S(e)||j(`handlerType`),S(e)&&Object.values(e).some(function(e){return!w(e)})&&j(`handlersType`)}function k(e){e||j(`initialIsRequired`),S(e)||j(`initialType`),C(e)&&j(`initialContent`)}function A(e,t){throw Error(e[t]||e.default)}var j=x(A)({initialIsRequired:`initial state is required`,initialType:`initial state should be an object`,initialContent:`initial state shouldn't be an empty object`,handlerType:`handler should be an object or a function`,handlersType:`all handlers should be a functions`,selectorType:`selector should be a function`,changeType:`provided value of changes should be an object`,changeField:`it seams you want to change a field in the state which is not specified in the "initial" state`,default:"an unknown error accured in `state-local` package"}),M={changes:E,selector:D,handler:O,initial:k};function N(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};M.initial(e),M.handler(t);var n={current:e},r=x(ee)(n,t),i=x(F)(n),a=x(M.changes)(e),o=x(P)(n);function s(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(e){return e};return M.selector(e),e(n.current)}function c(e){b(r,i,a,o)(e)}return[s,c]}function P(e,t){return w(t)?t(e.current):t}function F(e,t){return e.current=y(y({},e.current),t),t}function ee(e,t,n){return w(t)?t(e.current):Object.keys(n).forEach(function(n){return t[n]?.call(t,e.current[n])}),n}var te={create:N},ne={paths:{vs:`https://cdn.jsdelivr.net/npm/monaco-editor@0.55.1/min/vs`}};function re(e){return function t(){var n=this,r=[...arguments];return r.length>=e.length?e.apply(this,r):function(){var e=[...arguments];return t.apply(n,[].concat(r,e))}}}function ie(e){return{}.toString.call(e).includes(`Object`)}function ae(e){return e||ce(`configIsRequired`),ie(e)||ce(`configType`),e.urls?(oe(),{paths:{vs:e.urls.monacoBase}}):e}function oe(){console.warn(I.deprecation)}function se(e,t){throw Error(e[t]||e.default)}var I={configIsRequired:`the configuration object is required`,configType:`the configuration object should be an object`,default:"an unknown error accured in `@monaco-editor/loader` package",deprecation:`Deprecation warning!
|
|
3
|
+
You are using deprecated way of configuration.
|
|
4
|
+
|
|
5
|
+
Instead of using
|
|
6
|
+
monaco.config({ urls: { monacoBase: '...' } })
|
|
7
|
+
use
|
|
8
|
+
monaco.config({ paths: { vs: '...' } })
|
|
9
|
+
|
|
10
|
+
For more please check the link https://github.com/suren-atoyan/monaco-loader#config
|
|
11
|
+
`},ce=re(se)(I),le={config:ae},ue=function(){var e=[...arguments];return function(t){return e.reduceRight(function(e,t){return t(e)},t)}};function L(e,t){return Object.keys(t).forEach(function(n){t[n]instanceof Object&&e[n]&&Object.assign(t[n],L(e[n],t[n]))}),u(u({},e),t)}var de={type:`cancelation`,msg:`operation is manually canceled`};function R(e){var t=!1,n=new Promise(function(n,r){e.then(function(e){return t?r(de):n(e)}),e.catch(r)});return n.cancel=function(){return t=!0},n}var fe=[`monaco`],z=p(te.create({config:ne,isInitialized:!1,resolve:null,reject:null,monaco:null}),2),B=z[0],V=z[1];function pe(e){var t=le.config(e),n=t.monaco,r=d(t,fe);V(function(e){return{config:L(e.config,r),monaco:n}})}function me(){var e=B(function(e){return{monaco:e.monaco,isInitialized:e.isInitialized,resolve:e.resolve}});if(!e.isInitialized){if(V({isInitialized:!0}),e.monaco)return e.resolve(e.monaco),R(U);if(window.monaco&&window.monaco.editor)return H(window.monaco),e.resolve(window.monaco),R(U);ue(he,_e)(ve)}return R(U)}function he(e){return document.body.appendChild(e)}function ge(e){var t=document.createElement(`script`);return e&&(t.src=e),t}function _e(e){var t=B(function(e){return{config:e.config,reject:e.reject}}),n=ge(`${t.config.paths.vs}/loader.js`);return n.onload=function(){return e()},n.onerror=t.reject,n}function ve(){var e=B(function(e){return{config:e.config,resolve:e.resolve,reject:e.reject}}),t=window.require;t.config(e.config),t([`vs/editor/editor.main`],function(t){var n=t.m||t;H(n),e.resolve(n)},function(t){e.reject(t)})}function H(e){B().monaco||V({monaco:e})}function ye(){return B(function(e){return e.monaco})}var U=new Promise(function(e,t){return V({resolve:e,reject:t})}),W={config:pe,init:me,__getMonacoInstance:ye},G=t(n(),1),K={wrapper:{display:`flex`,position:`relative`,textAlign:`initial`},fullWidth:{width:`100%`},hide:{display:`none`}},be={container:{display:`flex`,height:`100%`,width:`100%`,justifyContent:`center`,alignItems:`center`}};function xe({children:e}){return G.createElement(`div`,{style:be.container},e)}var Se=xe;function Ce({width:e,height:t,isEditorReady:n,loading:r,_ref:i,className:a,wrapperProps:o}){return G.createElement(`section`,{style:{...K.wrapper,width:e,height:t},...o},!n&&G.createElement(Se,null,r),G.createElement(`div`,{ref:i,style:{...K.fullWidth,...!n&&K.hide},className:a}))}var q=(0,G.memo)(Ce);function we(e){(0,G.useEffect)(e,[])}var J=we;function Te(e,t,n=!0){let r=(0,G.useRef)(!0);(0,G.useEffect)(r.current||!n?()=>{r.current=!1}:e,t)}var Y=Te;function X(){}function Z(e,t,n,r){return Ee(e,r)||De(e,t,n,r)}function Ee(e,t){return e.editor.getModel(Oe(e,t))}function De(e,t,n,r){return e.editor.createModel(t,n,r?Oe(e,r):void 0)}function Oe(e,t){return e.Uri.parse(t)}function ke({original:e,modified:t,language:n,originalLanguage:r,modifiedLanguage:i,originalModelPath:a,modifiedModelPath:o,keepCurrentOriginalModel:s=!1,keepCurrentModifiedModel:c=!1,theme:l=`light`,loading:u=`Loading...`,options:d={},height:f=`100%`,width:p=`100%`,className:m,wrapperProps:h={},beforeMount:g=X,onMount:_=X}){let[v,y]=(0,G.useState)(!1),[b,x]=(0,G.useState)(!0),S=(0,G.useRef)(null),C=(0,G.useRef)(null),w=(0,G.useRef)(null),T=(0,G.useRef)(_),E=(0,G.useRef)(g),D=(0,G.useRef)(!1);J(()=>{let e=W.init();return e.then(e=>(C.current=e)&&x(!1)).catch(e=>e?.type!==`cancelation`&&console.error(`Monaco initialization: error:`,e)),()=>S.current?A():e.cancel()}),Y(()=>{if(S.current&&C.current){let t=S.current.getOriginalEditor(),i=Z(C.current,e||``,r||n||`text`,a||``);i!==t.getModel()&&t.setModel(i)}},[a],v),Y(()=>{if(S.current&&C.current){let e=S.current.getModifiedEditor(),r=Z(C.current,t||``,i||n||`text`,o||``);r!==e.getModel()&&e.setModel(r)}},[o],v),Y(()=>{let e=S.current.getModifiedEditor();e.getOption(C.current.editor.EditorOption.readOnly)?e.setValue(t||``):t!==e.getValue()&&(e.executeEdits(``,[{range:e.getModel().getFullModelRange(),text:t||``,forceMoveMarkers:!0}]),e.pushUndoStop())},[t],v),Y(()=>{S.current?.getModel()?.original.setValue(e||``)},[e],v),Y(()=>{let{original:e,modified:t}=S.current.getModel();C.current.editor.setModelLanguage(e,r||n||`text`),C.current.editor.setModelLanguage(t,i||n||`text`)},[n,r,i],v),Y(()=>{C.current?.editor.setTheme(l)},[l],v),Y(()=>{S.current?.updateOptions(d)},[d],v);let O=(0,G.useCallback)(()=>{if(!C.current)return;E.current(C.current);let s=Z(C.current,e||``,r||n||`text`,a||``),c=Z(C.current,t||``,i||n||`text`,o||``);S.current?.setModel({original:s,modified:c})},[n,t,i,e,r,a,o]),k=(0,G.useCallback)(()=>{!D.current&&w.current&&(S.current=C.current.editor.createDiffEditor(w.current,{automaticLayout:!0,...d}),O(),C.current?.editor.setTheme(l),y(!0),D.current=!0)},[d,l,O]);(0,G.useEffect)(()=>{v&&T.current(S.current,C.current)},[v]),(0,G.useEffect)(()=>{!b&&!v&&k()},[b,v,k]);function A(){let e=S.current?.getModel();s||e?.original?.dispose(),c||e?.modified?.dispose(),S.current?.dispose()}return G.createElement(q,{width:p,height:f,isEditorReady:v,loading:u,_ref:w,className:m,wrapperProps:h})}var Ae=(0,G.memo)(ke);function je(e){let t=(0,G.useRef)();return(0,G.useEffect)(()=>{t.current=e},[e]),t.current}var Me=je,Q=new Map;function Ne({defaultValue:e,defaultLanguage:t,defaultPath:n,value:r,language:i,path:a,theme:o=`light`,line:s,loading:c=`Loading...`,options:l={},overrideServices:u={},saveViewState:d=!0,keepCurrentModel:f=!1,width:p=`100%`,height:m=`100%`,className:h,wrapperProps:g={},beforeMount:_=X,onMount:v=X,onChange:y,onValidate:b=X}){let[x,S]=(0,G.useState)(!1),[C,w]=(0,G.useState)(!0),T=(0,G.useRef)(null),E=(0,G.useRef)(null),D=(0,G.useRef)(null),O=(0,G.useRef)(v),k=(0,G.useRef)(_),A=(0,G.useRef)(),j=(0,G.useRef)(r),M=Me(a),N=(0,G.useRef)(!1),P=(0,G.useRef)(!1);J(()=>{let e=W.init();return e.then(e=>(T.current=e)&&w(!1)).catch(e=>e?.type!==`cancelation`&&console.error(`Monaco initialization: error:`,e)),()=>E.current?ee():e.cancel()}),Y(()=>{let o=Z(T.current,e||r||``,t||i||``,a||n||``);o!==E.current?.getModel()&&(d&&Q.set(M,E.current?.saveViewState()),E.current?.setModel(o),d&&E.current?.restoreViewState(Q.get(a)))},[a],x),Y(()=>{E.current?.updateOptions(l)},[l],x),Y(()=>{!E.current||r===void 0||(E.current.getOption(T.current.editor.EditorOption.readOnly)?E.current.setValue(r):r!==E.current.getValue()&&(P.current=!0,E.current.executeEdits(``,[{range:E.current.getModel().getFullModelRange(),text:r,forceMoveMarkers:!0}]),E.current.pushUndoStop(),P.current=!1))},[r],x),Y(()=>{let e=E.current?.getModel();e&&i&&T.current?.editor.setModelLanguage(e,i)},[i],x),Y(()=>{s!==void 0&&E.current?.revealLine(s)},[s],x),Y(()=>{T.current?.editor.setTheme(o)},[o],x);let F=(0,G.useCallback)(()=>{if(!(!D.current||!T.current)&&!N.current){k.current(T.current);let c=a||n,f=Z(T.current,r||e||``,t||i||``,c||``);E.current=T.current?.editor.create(D.current,{model:f,automaticLayout:!0,...l},u),d&&E.current.restoreViewState(Q.get(c)),T.current.editor.setTheme(o),s!==void 0&&E.current.revealLine(s),S(!0),N.current=!0}},[e,t,n,r,i,a,l,u,d,o,s]);(0,G.useEffect)(()=>{x&&O.current(E.current,T.current)},[x]),(0,G.useEffect)(()=>{!C&&!x&&F()},[C,x,F]),j.current=r,(0,G.useEffect)(()=>{x&&y&&(A.current?.dispose(),A.current=E.current?.onDidChangeModelContent(e=>{P.current||y(E.current.getValue(),e)}))},[x,y]),(0,G.useEffect)(()=>{if(x){let e=T.current.editor.onDidChangeMarkers(e=>{let t=E.current.getModel()?.uri;if(t&&e.find(e=>e.path===t.path)){let e=T.current.editor.getModelMarkers({resource:t});b?.(e)}});return()=>{e?.dispose()}}return()=>{}},[x,b]);function ee(){A.current?.dispose(),f?d&&Q.set(a,E.current.saveViewState()):E.current.getModel()?.dispose(),E.current.dispose()}return G.createElement(q,{width:p,height:m,isEditorReady:x,loading:c,_ref:D,className:h,wrapperProps:g})}var Pe=(0,G.memo)(Ne),$=e();function Fe({value:e,onChange:t,placeholder:n,className:i,minHeight:a=`240px`,height:o,language:s=`json`,readOnly:c=!1}){let l=(0,G.useRef)(null),u=(0,G.useRef)(null),[d,f]=(0,G.useState)(s),{resolvedTheme:p}=r();(0,G.useEffect)(()=>{if(!e.trim()){f(s);return}let t=e.trim();if(t.startsWith(`{`)||t.startsWith(`[`)){f(`json`);return}if(t.startsWith(`<!DOCTYPE`)||t.startsWith(`<html`)||t.match(/^<\w+/)){f(`html`);return}if(t.match(/^[.#@]?[\w-]+\s*\{/)||t.includes(`/*`)&&t.includes(`*/`)){f(`css`);return}if(t.startsWith(`function`)||t.startsWith(`const `)||t.startsWith(`let `)||t.startsWith(`var `)||t.startsWith(`import `)||t.startsWith(`export `)||t.includes(`=>`)){f(`javascript`);return}f(s)},[e,s]);let m=(e,t)=>{l.current=e,u.current=t,t.languages.json.jsonDefaults.setDiagnosticsOptions({validate:!0,allowComments:!0,schemas:[],enableSchemaRequest:!1}),e.updateOptions({fontSize:13,lineHeight:20,tabSize:2,minimap:{enabled:!1},scrollBeyondLastLine:!1,wordWrap:`on`,wrappingStrategy:`advanced`,automaticLayout:!0,folding:!0,lineNumbers:`on`,renderLineHighlight:`all`,scrollbar:{vertical:`auto`,horizontal:`auto`,useShadows:!1,verticalScrollbarSize:8,horizontalScrollbarSize:8},suggest:{showKeywords:!0,showSnippets:!0},quickSuggestions:{other:!0,comments:!1,strings:!0}}),t.editor.setTheme(p===`dark`?`vs-dark`:`vs`)};(0,G.useEffect)(()=>{u.current&&u.current.editor.setTheme(p===`dark`?`vs-dark`:`vs`)},[p]);let h=e=>{t(e||``)},g=o||a;return(0,$.jsxs)(`div`,{className:`rounded-md border border-input overflow-hidden ${i||``}`,style:o===`flex`?{height:`100%`,display:`flex`,flexDirection:`column`}:void 0,children:[(0,$.jsx)(Pe,{height:o===`flex`?`100%`:g,language:d,value:e,onChange:h,onMount:m,options:{readOnly:c},loading:(0,$.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-sm text-muted-foreground`,children:[(0,$.jsx)(`div`,{className:`w-6 h-6 border-2 border-primary/30 border-t-primary rounded-full animate-spin`}),(0,$.jsx)(`span`,{children:`加载编辑器中...`})]})}),!e&&n&&(0,$.jsx)(`div`,{className:`absolute top-2 left-14 text-sm text-muted-foreground pointer-events-none select-none`,children:n})]})}function Ie({original:e,modified:t,className:n,minHeight:i=`320px`,height:a,language:o=`javascript`,readOnly:s=!0}){let c=(0,G.useRef)(null),{resolvedTheme:l}=r(),u=(e,t)=>{c.current=t,t.editor.setTheme(l===`dark`?`vs-dark`:`vs`)};(0,G.useEffect)(()=>{c.current&&c.current.editor.setTheme(l===`dark`?`vs-dark`:`vs`)},[l]);let d=a||i;return(0,$.jsx)(`div`,{className:`rounded-md border border-input overflow-hidden ${n||``}`,style:a===`flex`?{height:`100%`,display:`flex`,flexDirection:`column`}:void 0,children:(0,$.jsx)(Ae,{height:a===`flex`?`100%`:d,language:o,original:e,modified:t,onMount:u,options:{readOnly:s,renderSideBySide:!0,originalEditable:!1,minimap:{enabled:!1},scrollBeyondLastLine:!1,wordWrap:`on`,automaticLayout:!0,folding:!0,renderOverviewRuler:!1,diffWordWrap:`on`,scrollbar:{vertical:`auto`,horizontal:`auto`,useShadows:!1,verticalScrollbarSize:8,horizontalScrollbarSize:8}},loading:(0,$.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-sm text-muted-foreground`,children:[(0,$.jsx)(`div`,{className:`w-6 h-6 border-2 border-primary/30 border-t-primary rounded-full animate-spin`}),(0,$.jsx)(`span`,{children:`加载 Diff 编辑器中...`})]})})})}export{Fe as n,Ie as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{l as e}from"./button-BTToMaBW.js";var t=e(`pencil-line`,[[`path`,{d:`M13 21h8`,key:`1jsn5i`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}],[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}]]);export{t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,f as t,t as n,u as r}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as i}from"./pencil-line-Cqe41E4h.js";import{t as a}from"./rotate-ccw-CAYM6Vv0.js";import{t as o}from"./zap-Djo4cgux.js";import"./es2015-CfXu88Y7.js";import{i as s,o as ee,r as c}from"./ai-config-store-DQXVJVn_.js";import{$ as l,_ as u,b as te,d,f,ft as p,g as m,h,m as g,ot as _,p as v,u as y,v as b,y as x,z as ne}from"./index-L7uWxTnp.js";import{n as re}from"./monaco-editor-B3brLg8j.js";import{t as ie}from"./textarea-C6NooVK1.js";var S=t(r(),1),C=e();function w({open:e=!1,onOpenChange:t,embedded:r=!1,filename:w,onSaved:T}){let[E,D]=(0,S.useState)(``),[O,k]=(0,S.useState)(``),[A,j]=(0,S.useState)(!1),[M,N]=(0,S.useState)(!1),[P,F]=(0,S.useState)(!1),[I,L]=(0,S.useState)(!1),[R,z]=(0,S.useState)(null),[B,V]=(0,S.useState)(``),[H,U]=(0,S.useState)(null),[W,G]=(0,S.useState)(!1),K=E!==O,q=c(),J=s(q),Y=J?{provider:J.provider,apiKey:J.apiKey,baseUrl:J.baseUrl,model:J.model}:{provider:q.provider,apiKey:q.apiKey,baseUrl:q.baseUrl,model:q.model},X=ee(q),Z=(0,S.useCallback)(async()=>{if(w){j(!0),z(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(w)}/code`);if(!e.ok){let t=await e.json();throw Error(t.error||`读取插件代码失败`)}let t=await e.json();D(t.code),k(t.code)}catch(e){z(e instanceof Error?e.message:`读取失败`)}finally{j(!1)}}},[w]);(0,S.useEffect)(()=>{(e||r)&&w&&Z()},[e,r,w,Z]);let Q=async()=>{N(!0),z(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(w)}/code`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:E})});if(!e.ok){let t=await e.json();throw Error(t.error||`保存失败`)}k(E),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`)),T?.(),y.success(`插件代码保存成功`)}catch(e){let t=e instanceof Error?e.message:`保存失败`;z(t),y.error(t)}finally{N(!1)}},ae=async()=>{N(!0),F(!0),z(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(w)}/code`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:E})});if(!e.ok){let t=await e.json();throw Error(t.error||`保存失败`)}if(k(E),!(await fetch(`/api/plugins/reload`,{method:`POST`})).ok)throw Error(`热加载失败`);T?.(),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`)),y.success(`插件代码已保存并完成热加载`)}catch(e){let t=e instanceof Error?e.message:`操作失败`;z(t),y.error(t)}finally{N(!1),F(!1)}};d({active:e||r,enabled:K&&!M&&!I,priority:f.panel,onSave:Q});let oe=()=>{D(O)},se=()=>{K&&!confirm(`有未保存的修改,确定要关闭吗?`)||(G(!1),t?.(!1))},ce=async()=>{if(!B.trim()||!X)return;let e=E;G(!0),L(!0),z(null),U(`AI 正在根据补充需求更新代码...`);try{let e=await fetch(`/api/plugins/revise-stream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({originalCode:E,instruction:B.trim(),requirement:{name:w.replace(/\.js$/i,``),description:`根据补充要求更新插件 ${w},保持 Meddle 插件结构和现有核心能力正确。`},aiConfig:Y})});if(!e.ok){let t=await e.json();throw Error(t.error||`AI 更新代码失败`)}let t=e.body?.getReader(),n=new TextDecoder;if(!t)throw Error(`无法读取 AI 更新流`);let r=``,i=``;for(;;){let{done:e,value:a}=await t.read();if(e)break;i+=n.decode(a,{stream:!0});let o=i.split(`
|
|
2
|
+
`);i=o.pop()||``;for(let e of o){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t)try{let e=JSON.parse(t);if(e.status===`generating`)U(`AI 正在根据补充需求更新代码...`);else if(e.chunk)r=e.accumulated||`${r}${e.chunk}`,D(r),U(`生成中... ${r.length} 字符`);else if(e.status===`success`)r=e.revisedCode||r,D(r),U(`AI 已完成代码更新,请检查后保存。`);else if(e.error)throw Error(e.error)}catch(e){if(e instanceof Error&&e.message!==`Unexpected end of JSON input`)throw e}}}if(!r.trim())throw Error(`AI 未返回有效代码`)}catch(t){let n=t instanceof Error?t.message:`AI 更新代码失败`;D(e),z(n),U(`更新失败,已恢复原代码:${n}`)}finally{L(!1)}},$=(0,C.jsxs)(C.Fragment,{children:[(0,C.jsxs)(b,{className:`px-6 pt-6 pb-3`,children:[(0,C.jsxs)(x,{className:`flex items-center gap-2`,children:[(0,C.jsx)(p,{className:`h-5 w-5`}),w,K&&(0,C.jsx)(ne,{variant:`outline`,className:`text-orange-600 border-orange-300`,children:`未保存`})]}),(0,C.jsx)(u,{children:`查看和编辑插件源码,保存后需热加载才能生效`})]}),(0,C.jsx)(g,{}),(0,C.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden px-4 py-3`,children:A?(0,C.jsxs)(`div`,{className:`flex flex-1 items-center justify-center gap-2 text-muted-foreground`,children:[(0,C.jsx)(_,{className:`h-5 w-5 animate-spin`}),(0,C.jsx)(`span`,{children:`加载中...`})]}):R&&!E?(0,C.jsx)(`div`,{className:`flex flex-1 items-center justify-center text-destructive`,children:R}):(0,C.jsx)(`div`,{className:`min-h-0 flex-1`,children:(0,C.jsx)(`div`,{className:`relative h-full min-h-[320px]`,children:(0,C.jsx)(re,{value:E,onChange:D,language:`javascript`,height:`flex`})})})}),(0,C.jsx)(`div`,{"aria-hidden":!W,className:[`overflow-hidden transition-[max-height,opacity] duration-200 ease-out`,W?`max-h-[260px] border-t opacity-100`:`max-h-0 border-t-0 opacity-0 pointer-events-none`].join(` `),children:(0,C.jsxs)(`div`,{className:`space-y-3 px-6 py-4`,children:[(0,C.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,C.jsxs)(`div`,{className:`min-w-0`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2 text-sm font-medium`,children:[(0,C.jsx)(i,{className:`h-4 w-4`}),`AI 更新代码`]}),(0,C.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`输入补充需求后,AI 会直接把结果写回当前编辑器。`})]}),(0,C.jsx)(n,{variant:`ghost`,size:`sm`,className:`h-7 px-2 text-xs`,onClick:()=>G(!1),disabled:!W||I,children:`收起`})]}),(0,C.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-[minmax(0,1fr)_auto] md:items-end`,children:[(0,C.jsxs)(`div`,{className:`app-field-group`,children:[(0,C.jsx)(te,{htmlFor:`plugin-editor-extra-instruction`,children:`补充需求信息`}),(0,C.jsx)(ie,{id:`plugin-editor-extra-instruction`,value:B,onChange:e=>V(e.target.value),placeholder:`例如:补充 onBeforeResponse 对空 referer 的处理;保留现有 manifest 和 hook,不要改插件 id。`,className:`min-h-[88px] resize-none`,disabled:!W||I||M})]}),(0,C.jsx)(n,{size:`sm`,onClick:ce,disabled:!W||!B.trim()||!X||I||M,title:X?`根据补充需求更新当前代码`:`AI 未配置或未启用`,children:I?(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(_,{className:`h-4 w-4 mr-1 animate-spin`}),`更新中...`]}):(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(i,{className:`h-4 w-4 mr-1`}),`更新代码`]})})]}),(0,C.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:H||(X?`生成结果会写回上方编辑器,请检查后再保存或热加载。`:`AI 未配置或未启用,请先在设置中配置 AI 服务。`)})]})}),R&&E&&(0,C.jsx)(`div`,{className:`px-6 py-2 text-sm text-destructive bg-destructive/10`,children:R}),(0,C.jsx)(g,{}),(0,C.jsxs)(`div`,{className:`px-6 py-3 flex justify-between items-center gap-2`,children:[(0,C.jsxs)(`div`,{className:`flex gap-2`,children:[(0,C.jsxs)(n,{variant:`ghost`,size:`sm`,onClick:oe,disabled:!K||M||I,title:`撤销修改`,children:[(0,C.jsx)(a,{className:`h-4 w-4 mr-1`}),`还原`]}),(0,C.jsxs)(n,{variant:`outline`,size:`sm`,onClick:()=>G(e=>!e),disabled:!E||M||I,title:X?`使用 AI 根据补充需求更新代码`:`AI 未配置或未启用`,children:[(0,C.jsx)(i,{className:`h-4 w-4 mr-1`}),`AI 更新代码`]})]}),(0,C.jsxs)(`div`,{className:`flex gap-2`,children:[(0,C.jsx)(n,{variant:`outline`,size:`sm`,onClick:se,disabled:M||I,children:`关闭`}),(0,C.jsxs)(v,{variant:`outline`,size:`sm`,onClick:Q,disabled:!K||M||I,children:[M&&!P?(0,C.jsx)(_,{"data-icon":`inline-start`,className:`animate-spin`}):(0,C.jsx)(l,{"data-icon":`inline-start`}),`保存`]}),(0,C.jsxs)(n,{size:`sm`,onClick:ae,disabled:!K||M||I,children:[P?(0,C.jsx)(_,{className:`h-4 w-4 mr-1 animate-spin`}):(0,C.jsx)(o,{className:`h-4 w-4 mr-1`}),`保存并热加载`]})]})]})]});return r?(0,C.jsx)(`div`,{className:`flex h-full min-h-0 flex-col`,children:$}):(0,C.jsx)(h,{open:e,onOpenChange:e=>{!e&&K&&!confirm(`有未保存的修改,确定要关闭吗?`)||(e||G(!1),t?.(e))},children:(0,C.jsx)(m,{className:`p-0 flex flex-col`,resizable:!0,defaultWidth:900,storageKey:`plugin-code-editor`,children:$})})}export{w as PluginCodeEditor};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as a}from"./refresh-cw-CG3HaiQT.js";import{t as o}from"./zap-Djo4cgux.js";import{a as s,i as c,n as l,o as u,r as d,t as ee}from"./select-CkFOB61l.js";import"./es2015-CfXu88Y7.js";import{t as f}from"./switch-C-Xk56TK.js";import{A as p,K as m,X as h,Y as g,ft as _,nt as v,ot as y,z as b}from"./index-L7uWxTnp.js";import{a as x,i as S,n as C,o as w,r as T,t as E}from"./table-CT97lAYq.js";var D=n(`shield-alert`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`M12 8v4`,key:`1got3b`}],[`path`,{d:`M12 16h.01`,key:`1drbdi`}]]),O=n(`shield`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}]]),k=t(i(),1),A=e();function j({plugins:e,pluginMode:t,switchPluginMode:n,fetchPlugins:i,startPlugin:j,stopPlugin:M,togglePlugin:N,thirdPartyPlugins:P,thirdPartySecurity:F,fetchThirdPartyPlugins:I,loadThirdPartyPlugin:L,unloadThirdPartyPlugin:R}){let[z,B]=(0,k.useState)(!1),[V,H]=(0,k.useState)(``),[U,W]=(0,k.useState)(!1),[G,K]=(0,k.useState)([]),[q,J]=(0,k.useState)(!1);(0,k.useEffect)(()=>{i(),I(),Y()},[i,I]),(0,k.useEffect)(()=>{let e=()=>{Y()};return window.addEventListener(`plugins-custom-updated`,e),()=>window.removeEventListener(`plugins-custom-updated`,e)},[]);let Y=async()=>{try{K((await(await fetch(`/api/plugins/custom`)).json()).plugins||[])}catch(e){console.error(`加载自定义插件失败:`,e)}},X=async e=>{if(confirm(`确定要删除插件 ${e} 吗?`))try{let t=await fetch(`/api/plugins/custom/${encodeURIComponent(e)}`,{method:`DELETE`});if(t.ok)await Y();else{let e=await t.json();alert(e.error||`删除失败`)}}catch(e){console.error(`删除插件失败:`,e),alert(`删除失败`)}},Z=async()=>{J(!0);try{let e=await fetch(`/api/plugins/reload`,{method:`POST`});if(e.ok){let t=await e.json();alert(`成功热加载 ${t.count} 个插件!`),await i(),await Y()}else{let t=await e.json();alert(t.error||`热加载失败`)}}catch(e){console.error(`热加载失败:`,e),alert(`热加载失败`)}finally{J(!1)}},Q=(e,t,n)=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`plugin.test`,title:`测试插件:${t}`,size:`xl`,params:{pluginId:e,pluginName:t,hooks:n}}}))},$=e=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`plugin.code`,title:`编辑插件代码:${e}`,size:`xl`,params:{filename:e}}}))},te=async e=>{B(!0);try{await j(e),await i()}finally{B(!1)}},ne=async e=>{B(!0);try{await M(e),await i()}finally{B(!1)}},re=async()=>{if(V.trim()){W(!0);try{await L(V),H(``),await I()}finally{W(!1)}}},ie=async e=>{W(!0);try{await R(e),await I()}finally{W(!1)}};return(0,A.jsxs)(`div`,{className:`app-page-stack`,children:[(0,A.jsxs)(`section`,{className:`app-section`,children:[(0,A.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,A.jsx)(`h3`,{className:`text-sm font-medium`,children:`内置插件`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`插件模式:`}),(0,A.jsxs)(ee,{value:t,onValueChange:e=>n(e),children:[(0,A.jsx)(s,{className:`w-28 h-7 text-xs`,children:(0,A.jsx)(u,{})}),(0,A.jsx)(l,{children:(0,A.jsxs)(d,{children:[(0,A.jsx)(c,{value:`off`,children:`关闭`}),(0,A.jsx)(c,{value:`on`,children:`开启`}),(0,A.jsx)(c,{value:`shadow`,children:`影子模式`})]})})]}),t===`off`&&(0,A.jsx)(b,{variant:`destructive`,className:`text-xs`,children:`插件未生效`})]})]}),(0,A.jsx)(`div`,{className:`rounded-md border`,children:(0,A.jsxs)(E,{children:[(0,A.jsx)(x,{children:(0,A.jsxs)(w,{children:[(0,A.jsx)(S,{children:`名称`}),(0,A.jsx)(S,{children:`版本`}),(0,A.jsx)(S,{children:`Hooks`}),(0,A.jsx)(S,{children:`状态`}),(0,A.jsx)(S,{className:`w-24`,children:`操作`})]})}),(0,A.jsx)(C,{children:e.length===0?(0,A.jsx)(w,{children:(0,A.jsx)(T,{colSpan:5,className:`text-center text-muted-foreground py-8`,children:`暂无内置插件`})}):e.map(e=>(0,A.jsxs)(w,{children:[(0,A.jsx)(T,{className:`font-medium`,children:e.name}),(0,A.jsx)(T,{children:e.version}),(0,A.jsx)(T,{children:(0,A.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.hooks.map(e=>(0,A.jsx)(b,{variant:`secondary`,className:`text-xs`,children:e},e))})}),(0,A.jsx)(T,{children:(0,A.jsx)(b,{variant:e.state===`running`?`default`:`secondary`,children:e.state})}),(0,A.jsx)(T,{children:e.state===`running`?(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>ne(e.id),disabled:z,"aria-label":`停止插件 ${e.name}`,children:(0,A.jsx)(g,{})}):(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>te(e.id),disabled:z,"aria-label":`启动插件 ${e.name}`,children:(0,A.jsx)(v,{})})})]},e.id))})]})})]}),(0,A.jsxs)(`section`,{className:`app-section`,children:[(0,A.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,A.jsx)(`h3`,{className:`text-sm font-medium`,children:`自定义插件`}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,A.jsxs)(r,{variant:`outline`,size:`sm`,onClick:Y,disabled:z||q,children:[(0,A.jsx)(a,{"data-icon":`inline-start`}),`刷新列表`]}),(0,A.jsx)(r,{variant:`outline`,size:`sm`,onClick:Z,disabled:z||q,children:q?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(y,{"data-icon":`inline-start`,className:`animate-spin`}),`加载中...`]}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(o,{"data-icon":`inline-start`}),`热加载插件`]})}),(0,A.jsxs)(r,{size:`sm`,onClick:()=>window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`plugin.generate`,title:`AI 插件生成器`,size:`xl`}})),children:[(0,A.jsx)(h,{"data-icon":`inline-start`}),`AI 生成插件`]})]})]}),(0,A.jsx)(`div`,{className:`rounded-md border`,children:(0,A.jsxs)(E,{children:[(0,A.jsx)(x,{children:(0,A.jsxs)(w,{children:[(0,A.jsx)(S,{children:`插件名称`}),(0,A.jsx)(S,{className:`w-16 text-center`,children:`启用`}),(0,A.jsx)(S,{children:`状态`}),(0,A.jsx)(S,{children:`修改时间`}),(0,A.jsx)(S,{className:`w-32`,children:`操作`})]})}),(0,A.jsx)(C,{children:G.length===0?(0,A.jsx)(w,{children:(0,A.jsx)(T,{colSpan:5,className:`text-center text-muted-foreground py-8`,children:`暂无自定义插件,点击上方按钮使用 AI 生成插件`})}):G.map(t=>{let n=t.filename.replace(/\.js$/,``).replace(/^/,`local.`),i=e.find(e=>e.id===n),a=i?i.state!==`disabled`:!1;return(0,A.jsxs)(w,{className:!a&&i?`opacity-60`:``,children:[(0,A.jsx)(T,{className:`font-medium font-mono text-sm`,children:t.filename}),(0,A.jsx)(T,{className:`text-center`,children:i&&(0,A.jsx)(f,{checked:a,onCheckedChange:e=>N(i.id,e)})}),(0,A.jsx)(T,{children:i?a?(0,A.jsx)(b,{children:`已启用`}):(0,A.jsx)(b,{variant:`secondary`,children:`已禁用`}):(0,A.jsx)(b,{variant:`outline`,children:`未加载`})}),(0,A.jsx)(T,{className:`text-xs text-muted-foreground`,children:new Date(t.modified).toLocaleString()}),(0,A.jsx)(T,{children:(0,A.jsxs)(`div`,{className:`flex gap-1`,children:[(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>$(t.filename),title:`查看/编辑代码`,"aria-label":`编辑插件 ${t.filename}`,children:(0,A.jsx)(_,{})}),i&&a&&(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>Q(i.id,i.name,i.hooks),title:`测试插件`,"aria-label":`测试插件 ${i.name}`,children:(0,A.jsx)(m,{})}),(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>X(t.filename),className:`text-destructive`,title:`删除插件`,children:`删除`})]})})]},t.filename)})})]})})]}),(0,A.jsxs)(`section`,{className:`app-section`,children:[(0,A.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,A.jsx)(`h3`,{className:`text-sm font-medium`,children:`第三方插件`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[F.allowAll?(0,A.jsx)(O,{className:`size-4 text-primary`}):(0,A.jsx)(D,{className:`size-4 text-muted-foreground`}),(0,A.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:F.allowAll?`已信任所有插件`:`已信任: ${F.trusted.length} 个`})]})]}),(0,A.jsxs)(`div`,{className:`flex gap-2`,children:[(0,A.jsx)(p,{value:V,onChange:e=>H(e.target.value),placeholder:`输入插件路径...`,className:`flex-1`}),(0,A.jsx)(r,{onClick:re,disabled:U||!V.trim(),children:U?(0,A.jsx)(y,{className:`animate-spin`}):`加载`})]}),(0,A.jsx)(`div`,{className:`rounded-md border`,children:(0,A.jsxs)(E,{children:[(0,A.jsx)(x,{children:(0,A.jsxs)(w,{children:[(0,A.jsx)(S,{children:`名称`}),(0,A.jsx)(S,{children:`版本`}),(0,A.jsx)(S,{children:`状态`}),(0,A.jsx)(S,{className:`w-24`,children:`操作`})]})}),(0,A.jsx)(C,{children:P.length===0?(0,A.jsx)(w,{children:(0,A.jsx)(T,{colSpan:4,className:`text-center text-muted-foreground py-8`,children:`暂无第三方插件`})}):P.map(e=>(0,A.jsxs)(w,{children:[(0,A.jsx)(T,{className:`font-medium`,children:e.name}),(0,A.jsx)(T,{children:e.version}),(0,A.jsx)(T,{children:(0,A.jsx)(b,{variant:e.state===`running`?`default`:`secondary`,children:e.state})}),(0,A.jsx)(T,{children:(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>ie(e.id),disabled:U,className:`text-destructive`,children:`卸载`})})]},e.id))})]})})]})]})}export{j as PluginConfig};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,f as t,t as n,u as r}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as i}from"./circle-x-C9USji_R.js";import{t as a}from"./code-5_eJ_XpJ.js";import{t as o}from"./copy-BYjq1hdN.js";import{t as s}from"./wand-sparkles-wkul5vje.js";import"./es2015-CfXu88Y7.js";import{o as ee,r as te}from"./ai-config-store-DQXVJVn_.js";import{$ as ne,A as c,X as l,_ as re,b as u,d as ie,f as ae,g as oe,h as se,m as d,mt as ce,ot as f,p as le,pt as ue,u as p,v as de,y as fe,z as m}from"./index-L7uWxTnp.js";import{t as pe}from"./textarea-C6NooVK1.js";var h=t(r(),1),g=e();function _({open:e=!1,onOpenChange:t,embedded:r=!1,onPluginSaved:_}){let[v,y]=(0,h.useState)(``),[b,x]=(0,h.useState)(``),[S,C]=(0,h.useState)(``),[w,T]=(0,h.useState)(``),[E,D]=(0,h.useState)(!1),[O,k]=(0,h.useState)(!1),[A,j]=(0,h.useState)(``),[M,N]=(0,h.useState)(``),[P,F]=(0,h.useState)(null),[I,L]=(0,h.useState)(null),[R,z]=(0,h.useState)(``),[me,B]=(0,h.useState)(!1),[V,H]=(0,h.useState)(0),[U,W]=(0,h.useState)(0),[G,K]=(0,h.useState)(!1),[q,J]=(0,h.useState)(!1),Y=te(),X=ee(Y),he=async()=>{if(!v.trim()||!b.trim()){L(`error`),z(`请填写插件名称和描述`);return}if(!X){L(`error`),z(`AI 配置未完成,请先配置 AI 服务`);return}D(!0),L(null),z(`正在连接 AI 服务...`),j(``),H(0),W(0);let e=Date.now(),t=0;try{let n={name:v,description:b,hooks:S.split(`,`).map(e=>e.trim()).filter(Boolean),permissions:w.split(`,`).map(e=>e.trim()).filter(Boolean)},r=await fetch(`/api/plugins/generate-stream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({requirement:n,aiConfig:{provider:Y.provider,apiKey:Y.apiKey,baseUrl:Y.baseUrl,model:Y.model}})});if(!r.ok)throw Error(`请求失败: ${r.status}`);let i=r.body?.getReader(),a=new TextDecoder;if(!i)throw Error(`无法读取响应流`);let o=``;for(;;){let{done:n,value:r}=await i.read();if(n)break;o+=a.decode(r,{stream:!0});let s=o.split(`
|
|
2
|
+
`);o=s.pop()||``;for(let n of s)if(!n.startsWith(`event:`)&&n.startsWith(`data:`)){let r=n.slice(5).trim();try{let n=JSON.parse(r);if(n.status===`generating`)z(`AI 正在生成代码...`),W(10);else if(n.chunk){t++;let r=n.accumulated||n.chunk;j(r),H(r.length),W(Math.min(90,10+t*2));let i=((Date.now()-e)/1e3).toFixed(1);z(`生成中... (${r.length} 字符, ${i}s)`)}else if(n.status===`success`){j(n.plugin.code),N(n.plugin.filename),F(n.plugin.manifest),H(n.plugin.code.length),W(100),L(`success`);let t=((Date.now()-e)/1e3).toFixed(1);z(`插件代码生成成功!(${n.plugin.code.length} 字符, ${t}s)`)}else if(n.error)throw Error(n.error)}catch(e){if(e instanceof Error&&e.message!==`Unexpected end of JSON input`)throw e}}}}catch(e){L(`error`),z(e instanceof Error?e.message:`生成失败`),W(0)}finally{D(!1)}},Z=async()=>{if(!A||!M){L(`error`),z(`没有可保存的插件代码`);return}k(!0),L(null),z(`正在保存插件...`);try{let e=await fetch(`/api/plugins/save`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filename:M,code:A})});if(!e.ok){let t=await e.json();throw Error(t.error||`保存失败`)}await e.json(),L(`success`),z(`插件已保存!现在可以热加载并测试。`),K(!0),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`)),p.success(`插件保存成功`),_&&_(),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`))}catch(e){let t=e instanceof Error?e.message:`保存失败`;L(`error`),z(t),p.error(t)}finally{k(!1)}};ie({active:(e||r)&&!!A&&!G,enabled:!O&&!E&&!!M,priority:ae.panel,onSave:Z});let ge=async()=>{A&&(await navigator.clipboard.writeText(A),B(!0),setTimeout(()=>B(!1),2e3))},_e=async()=>{J(!0);try{let e=await fetch(`/api/plugins/reload`,{method:`POST`});if(!e.ok){let t=await e.json();throw Error(t.error||`热加载失败`)}let n=await e.json();L(`success`),z(`成功热加载 ${n.count} 个插件!插件已激活,可以使用了。`),_&&_(),setTimeout(()=>{t?.(!1),Q()},3e3)}catch(e){L(`error`),z(e instanceof Error?e.message:`热加载失败`)}finally{J(!1)}},Q=()=>{y(``),x(``),C(``),T(``),j(``),N(``),F(null),L(null),z(``),B(!1),H(0),W(0),K(!1),J(!1)},$=(0,g.jsxs)(g.Fragment,{children:[(0,g.jsxs)(de,{className:`px-6 pt-6 pb-4`,children:[(0,g.jsxs)(fe,{className:`flex items-center gap-2`,children:[(0,g.jsx)(l,{className:`h-5 w-5`}),`AI 插件生成器`]}),(0,g.jsx)(re,{children:`使用 AI 根据插件系统设计和您的需求自动生成自定义插件代码`})]}),(0,g.jsx)(d,{}),(0,g.jsxs)(`div`,{className:`app-panel-content`,children:[!X&&(0,g.jsx)(`div`,{className:`bg-yellow-50 dark:bg-yellow-950/20 border border-yellow-200 dark:border-yellow-900 rounded-md p-3`,children:(0,g.jsx)(`p`,{className:`text-sm text-yellow-700 dark:text-yellow-300`,children:`AI 功能未配置或未启用,请先在设置中配置 AI 服务`})}),(0,g.jsxs)(`div`,{className:`app-section`,children:[(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsxs)(u,{htmlFor:`pluginName`,children:[`插件名称 `,(0,g.jsx)(`span`,{className:`text-red-500`,children:`*`})]}),(0,g.jsx)(c,{id:`pluginName`,value:v,onChange:e=>y(e.target.value),placeholder:`例如:请求日志分析器`,disabled:E||O})]}),(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsxs)(u,{htmlFor:`pluginDescription`,children:[`插件描述 `,(0,g.jsx)(`span`,{className:`text-red-500`,children:`*`})]}),(0,g.jsx)(pe,{id:`pluginDescription`,value:b,onChange:e=>x(e.target.value),placeholder:`详细描述插件的功能,例如:分析HTTP请求日志,统计各个API的调用次数、响应时间等信息,并在控制台输出统计报告`,rows:4,disabled:E||O})]}),(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsx)(u,{htmlFor:`hooks`,children:`需要的 Hooks(可选,用逗号分隔)`}),(0,g.jsx)(c,{id:`hooks`,value:S,onChange:e=>C(e.target.value),placeholder:`例如:onRequestStart, onAfterResponse`,disabled:E||O}),(0,g.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`可选:onRequestStart, onBeforeProxy, onBeforeResponse, onAfterResponse, onError`})]}),(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsx)(u,{htmlFor:`permissions`,children:`需要的权限(可选,用逗号分隔)`}),(0,g.jsx)(c,{id:`permissions`,value:w,onChange:e=>T(e.target.value),placeholder:`例如:proxy:read, storage:write`,disabled:E||O}),(0,g.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`可选:proxy:read, proxy:write, response:shortcircuit, storage:read, storage:write`})]})]}),E&&U>0&&(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsxs)(`div`,{className:`flex items-center justify-between text-sm`,children:[(0,g.jsx)(`span`,{className:`text-muted-foreground`,children:`生成进度`}),(0,g.jsxs)(`span`,{className:`font-medium`,children:[U,`%`]})]}),(0,g.jsx)(`div`,{className:`w-full bg-muted rounded-full h-2 overflow-hidden`,children:(0,g.jsx)(`div`,{className:`bg-primary h-full transition-all duration-300 ease-out`,style:{width:`${U}%`}})})]}),(A||E)&&(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,g.jsxs)(u,{className:`flex items-center gap-2`,children:[(0,g.jsx)(a,{className:`h-4 w-4`}),E?`正在生成插件代码`:`生成的插件代码`]}),(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[V>0&&(0,g.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[V,` 字符`]}),!E&&A&&(0,g.jsx)(n,{variant:`ghost`,size:`sm`,onClick:ge,className:`h-8`,children:me?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(ce,{className:`h-4 w-4 mr-1`}),`已复制`]}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(o,{className:`h-4 w-4 mr-1`}),`复制`]})})]})]}),(0,g.jsxs)(`div`,{className:`bg-muted rounded-md p-4 max-h-[400px] overflow-auto relative`,children:[E&&(0,g.jsx)(`div`,{className:`absolute top-2 right-2`,children:(0,g.jsx)(f,{className:`h-4 w-4 animate-spin text-muted-foreground`})}),(0,g.jsx)(`pre`,{className:`text-xs font-mono whitespace-pre-wrap break-all`,children:A||`等待 AI 响应...`})]}),P&&(0,g.jsxs)(`div`,{className:`bg-blue-50 dark:bg-blue-950/20 border border-blue-200 dark:border-blue-900 rounded-md p-3 space-y-2`,children:[(0,g.jsx)(`p`,{className:`text-sm font-medium text-blue-900 dark:text-blue-100`,children:`插件信息`}),(0,g.jsxs)(`div`,{className:`text-xs space-y-1 text-blue-700 dark:text-blue-300`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`strong`,{children:`ID:`}),` `,P.id]}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`strong`,{children:`名称:`}),` `,P.name]}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`strong`,{children:`版本:`}),` `,P.version]}),(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`strong`,{children:`Hooks:`}),(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:P.hooks.map(e=>(0,g.jsx)(m,{variant:`secondary`,className:`text-xs`,children:e},e))})]}),(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`strong`,{children:`权限:`}),(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:P.permissions.map(e=>(0,g.jsx)(m,{variant:`outline`,className:`text-xs`,children:e},e))})]})]})]})]}),R&&(0,g.jsxs)(`div`,{className:`flex items-start gap-2 p-3 rounded-md border ${I===`success`?`bg-green-50 dark:bg-green-950/20 border-green-200 dark:border-green-900`:I===`error`?`bg-red-50 dark:bg-red-950/20 border-red-200 dark:border-red-900`:`bg-blue-50 dark:bg-blue-950/20 border-blue-200 dark:border-blue-900`}`,children:[I===`success`&&(0,g.jsx)(ue,{className:`h-4 w-4 text-green-600 dark:text-green-400 mt-0.5`}),I===`error`&&(0,g.jsx)(i,{className:`h-4 w-4 text-red-600 dark:text-red-400 mt-0.5`}),E&&(0,g.jsx)(f,{className:`h-4 w-4 text-blue-600 dark:text-blue-400 mt-0.5 animate-spin`}),(0,g.jsx)(`span`,{className:`text-xs flex-1 ${I===`success`?`text-green-700 dark:text-green-300`:I===`error`?`text-red-700 dark:text-red-300`:`text-blue-700 dark:text-blue-300`}`,children:R})]})]}),(0,g.jsx)(d,{}),(0,g.jsxs)(`div`,{className:`px-6 py-4 flex justify-between gap-2`,children:[(0,g.jsx)(n,{variant:`outline`,size:`sm`,onClick:()=>{t?.(!1),Q()},disabled:E||O||q,children:G?`完成`:`取消`}),(0,g.jsx)(`div`,{className:`flex gap-2`,children:A?G?(0,g.jsx)(n,{size:`sm`,onClick:_e,disabled:q,className:`bg-green-600 hover:bg-green-700`,children:q?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(f,{className:`h-4 w-4 mr-1 animate-spin`}),`加载中...`]}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(l,{className:`h-4 w-4 mr-1`}),`热加载并测试`]})}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(n,{variant:`outline`,size:`sm`,onClick:()=>{j(``),N(``),F(null),L(null),z(``)},disabled:E||O,children:`重新生成`}),(0,g.jsx)(le,{size:`sm`,onClick:Z,disabled:O,children:O?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(f,{"data-icon":`inline-start`,className:`animate-spin`}),`保存中...`]}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(ne,{"data-icon":`inline-start`}),`保存插件`]})})]}):(0,g.jsx)(n,{size:`sm`,onClick:he,disabled:!X||E||O||!v.trim()||!b.trim(),children:E?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(f,{className:`h-4 w-4 mr-1 animate-spin`}),`生成中...`]}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(s,{className:`h-4 w-4 mr-1`}),`生成插件`]})})})]})]});return r?(0,g.jsx)(`div`,{className:`flex h-full min-h-0 flex-col`,children:$}):(0,g.jsx)(se,{open:e,onOpenChange:e=>{t?.(e),e||Q()},children:(0,g.jsx)(oe,{className:`p-0 flex flex-col`,resizable:!0,defaultWidth:900,storageKey:`plugin-generator`,children:$})})}export{_ as PluginGenerator};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as a}from"./arrow-right-B4Mrlj2-.js";import{t as o}from"./circle-alert-Q8cZk9Rv.js";import{t as s}from"./circle-x-C9USji_R.js";import{t as ee}from"./pencil-line-Cqe41E4h.js";import{t as c}from"./refresh-cw-CG3HaiQT.js";import{t as te}from"./wand-sparkles-wkul5vje.js";import"./es2015-CfXu88Y7.js";import{i as ne,o as re,r as ie}from"./ai-config-store-DQXVJVn_.js";import{A as ae,B as l,H as u,U as d,_ as oe,b as f,ft as se,g as ce,h as le,lt as ue,m as p,ot as m,pt as de,q as h,st as fe,v as pe,y as me,z as g}from"./index-L7uWxTnp.js";import{t as _}from"./body-diff-view-D7dCWajG.js";import{n as he,t as ge}from"./monaco-editor-B3brLg8j.js";import{t as _e}from"./textarea-C6NooVK1.js";var ve=n(`circle-play`,[[`path`,{d:`M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z`,key:`kmsa83`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),v=t(i(),1),y=e();function b(e){let t=new Map;return!e||typeof e!=`object`||Object.entries(e).forEach(([e,n])=>{t.set(e.toLowerCase(),{displayKey:e,value:n==null?``:String(n)})}),t}function x(e,t){let n=b(e),r=b(t);return Array.from(new Set([...n.keys(),...r.keys()])).sort().map(e=>{let t=n.get(e),i=r.get(e),a=t?.value??``,o=i?.value??``,s=`unchanged`;return!t&&i?s=`added`:t&&!i?s=`removed`:a!==o&&(s=`changed`),{key:e,displayKey:i?.displayKey??t?.displayKey??e,originalValue:a,modifiedValue:o,status:s}})}function S(e,t){let n=`rounded-md border px-2 py-1.5`;return e===`unchanged`?`${n} border-transparent`:e===`changed`?`${n} border-orange-300 bg-orange-500/10`:e===`added`?t===`modified`?`${n} border-green-300 bg-green-500/10`:`${n} border-transparent opacity-50`:e===`removed`?t===`original`?`${n} border-red-300 bg-red-500/10`:`${n} border-transparent opacity-50`:n}function ye({original:e,modified:t,mode:n=`split`}){let r=x(e,t);return n===`inline`?(0,y.jsx)(`div`,{className:`bg-muted/50 rounded-md p-2 text-xs font-mono max-h-[220px] overflow-auto space-y-1`,children:r.map(e=>(0,y.jsxs)(`div`,{className:`rounded-md border px-2 py-1.5 ${e.status===`unchanged`?`border-transparent`:e.status===`changed`?`border-orange-300 bg-orange-500/10`:e.status===`added`?`border-green-300 bg-green-500/10`:`border-red-300 bg-red-500/10`}`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,y.jsx)(`span`,{className:`text-muted-foreground`,children:e.displayKey}),(0,y.jsx)(g,{variant:`outline`,className:`h-5 px-1.5 text-[10px] font-normal`,children:e.status===`unchanged`?`未变`:e.status===`changed`?`修改`:e.status===`added`?`新增`:`删除`})]}),e.status===`changed`&&(0,y.jsxs)(`div`,{className:`mt-1 space-y-1`,children:[(0,y.jsxs)(`div`,{className:`text-red-700 dark:text-red-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`-`}),e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]}),(0,y.jsxs)(`div`,{className:`text-green-700 dark:text-green-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`+`}),e.modifiedValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]})]}),e.status===`added`&&(0,y.jsxs)(`div`,{className:`mt-1 text-green-700 dark:text-green-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`+`}),e.modifiedValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]}),e.status===`removed`&&(0,y.jsxs)(`div`,{className:`mt-1 text-red-700 dark:text-red-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`-`}),e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]}),e.status===`unchanged`&&(0,y.jsx)(`div`,{className:`mt-1`,children:e.modifiedValue||e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})})]},e.key))}):(0,y.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-0.5`,children:`原始`}),(0,y.jsx)(`div`,{className:`bg-muted/50 rounded-md p-2 text-xs font-mono max-h-[220px] overflow-auto space-y-1`,children:r.map(e=>(0,y.jsxs)(`div`,{className:S(e.status,`original`),children:[(0,y.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.displayKey,`:`]}),` `,e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]},`original-${e.key}`))})]}),(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-0.5`,children:`修改后`}),(0,y.jsx)(`div`,{className:`bg-muted/50 rounded-md p-2 text-xs font-mono max-h-[220px] overflow-auto space-y-1`,children:r.map(e=>(0,y.jsxs)(`div`,{className:S(e.status,`modified`),children:[(0,y.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.displayKey,`:`]}),` `,e.modifiedValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]},`modified-${e.key}`))})]})]})}function be(e){switch(e){case`generating`:return`AI 正在流式生成修复代码`;case`saving`:return`正在保存修复后的插件代码`;case`reloading`:return`正在热加载插件`;case`retesting`:return`正在重新执行插件测试`;default:return``}}function C({open:e=!1,onOpenChange:t,embedded:n=!1,pluginId:i,pluginName:b,hooks:x,onPluginFixed:S}){let[C,xe]=(0,v.useState)(!1),[w,T]=(0,v.useState)(!1),[Se,Ce]=(0,v.useState)(`https://365.wps.cn/home`),[we,Te]=(0,v.useState)(`GET`),[E,D]=(0,v.useState)(`standalone`),[O,k]=(0,v.useState)(null),[A,Ee]=(0,v.useState)(`split`),[j,De]=(0,v.useState)(`inline`),[M,N]=(0,v.useState)(null),[P,F]=(0,v.useState)(``),[I,L]=(0,v.useState)(``),[R,Oe]=(0,v.useState)(!1),[z,B]=(0,v.useState)(null),[V,H]=(0,v.useState)(``),[ke,U]=(0,v.useState)(`normal`),[W,Ae]=(0,v.useState)(``),[G,K]=(0,v.useState)(`idle`),q=ie(),J=ne(q),je=J?{provider:J.provider,apiKey:J.apiKey,baseUrl:J.baseUrl,model:J.model}:{provider:q.provider,apiKey:q.apiKey,baseUrl:q.baseUrl,model:q.model},Y=re(q),X=i.startsWith(`local.`)?`${i.slice(6)}.js`:``,Z=(0,v.useCallback)(async()=>{if(!X||!e){F(``),L(``),B(null);return}Oe(!0),B(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(X)}/code`);if(!e.ok){let t=await e.json();throw Error(t.error||`读取插件源码失败`)}let t=await e.json();F(t.code||``),!w&&!V&&L(t.code||``)}catch(e){F(``),L(``),B(e instanceof Error?e.message:`读取插件源码失败`)}finally{Oe(!1)}},[X,w,V,e]);(0,v.useEffect)(()=>{Z()},[Z]);let Q=(0,v.useMemo)(()=>{let e=[];return O?.error&&e.push({hookName:`test`,message:O.error}),Object.entries(O?.hookResults||{}).forEach(([t,n])=>{n?.status===`error`&&e.push({hookName:t,message:n.error||`未知错误`,stack:n.stack})}),O?.realRequest?.fetchError&&e.push({hookName:`fetch`,message:O.realRequest.fetchError}),e},[O]),Me=Q.length>0&&!!X,Ne=!!I&&!!(V||G===`idle`&&I&&P&&I!==P),Pe=async(e,t,n)=>{K(`saving`);let r=await fetch(`/api/plugins/custom/${encodeURIComponent(X)}/code`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:e})});if(!r.ok){let e=await r.json();throw Error(e.error||`保存修复后的代码失败`)}K(`reloading`);let i=await fetch(`/api/plugins/reload`,{method:`POST`});if(!i.ok){let e=await i.json().catch(()=>({error:`热加载失败`}));throw Error(e.error||`热加载失败`)}F(e),H(e),U(`diff`),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`)),S?.(),n&&(K(`retesting`),await Fe()),N({status:`success`,message:t}),K(`idle`)},Fe=async()=>{xe(!0),k(null),N(null);try{let e=await fetch(`/api/plugins/test`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pluginId:i,url:Se,method:we,integrated:E===`integrated`})});if(!e.ok){let t=await e.json();throw Error(t.error||`测试失败`)}k((await e.json()).results)}catch(e){k({error:e instanceof Error?e.message:`测试失败`})}finally{xe(!1)}},$=(0,y.jsxs)(y.Fragment,{children:[(0,y.jsxs)(pe,{className:`px-6 pt-6 pb-4`,children:[(0,y.jsxs)(me,{className:`flex items-center gap-2`,children:[(0,y.jsx)(h,{className:`h-5 w-5`}),`测试插件: `,b]}),(0,y.jsx)(oe,{children:`发起真实 HTTP 请求,在请求/响应过程中运行插件代码`})]}),(0,y.jsx)(p,{}),(0,y.jsxs)(`div`,{className:`app-panel-content`,children:[(0,y.jsxs)(`div`,{className:`app-section`,children:[(0,y.jsxs)(`div`,{className:`app-field-group`,children:[(0,y.jsx)(f,{htmlFor:`testUrl`,children:`请求 URL`}),(0,y.jsx)(ae,{id:`testUrl`,value:Se,onChange:e=>Ce(e.target.value),placeholder:`https://example.com/page`,disabled:C})]}),(0,y.jsxs)(`div`,{className:`app-field-group`,children:[(0,y.jsx)(f,{children:`HTTP 方法`}),(0,y.jsx)(`div`,{className:`flex gap-2`,children:[`GET`,`POST`,`PUT`,`DELETE`].map(e=>(0,y.jsx)(r,{type:`button`,variant:we===e?`selected`:`outline`,size:`sm`,onClick:()=>Te(e),disabled:C,children:e},e))})]}),(0,y.jsxs)(`div`,{className:`app-field-group`,children:[(0,y.jsx)(f,{children:`测试模式`}),(0,y.jsxs)(`div`,{className:`flex gap-2 flex-wrap`,children:[(0,y.jsx)(r,{type:`button`,variant:E===`standalone`?`selected`:`outline`,size:`sm`,onClick:()=>D(`standalone`),disabled:C,title:`直接请求 URL,不走路由与 Mock,便于排查插件自身逻辑`,children:`单独测试`}),(0,y.jsx)(r,{type:`button`,variant:E===`integrated`?`selected`:`outline`,size:`sm`,onClick:()=>D(`integrated`),disabled:C,title:`与真实代理一致:先路由解析、Mock 匹配,再请求,便于排查整体链路`,children:`集成测试`})]}),(0,y.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:E===`standalone`?`直接请求上述 URL,不经过路由规则和 Mock,适合验证插件逻辑。`:`先按路由规则解析目标、匹配 Mock,再请求,与经代理的真实请求一致,适合排查链路问题。`})]}),(0,y.jsx)(`div`,{className:`bg-blue-50 dark:bg-blue-950/20 border border-blue-200 dark:border-blue-900 rounded-md p-3`,children:(0,y.jsxs)(`p`,{className:`text-xs text-blue-700 dark:text-blue-300`,children:[(0,y.jsx)(`strong`,{children:`测试流程:`}),` 发起真实请求 → 获取服务器响应 → 运行插件 Hook(`,x.join(`, `),`)→ 展示对比结果`]})})]}),!!X&&(0,y.jsxs)(`div`,{className:`space-y-3`,children:[(0,y.jsx)(p,{}),(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(se,{className:`h-4 w-4`}),`插件代码`]}),(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsx)(l,{value:ke,onValueChange:e=>U(e),children:(0,y.jsxs)(u,{className:`h-7`,children:[(0,y.jsx)(d,{value:`normal`,className:`px-2 text-xs`,children:`正常视图`}),(0,y.jsx)(d,{value:`diff`,className:`px-2 text-xs`,disabled:!Ne,children:`Diff 视图`})]})}),(0,y.jsx)(g,{variant:`outline`,className:`text-xs font-normal`,children:X}),(0,y.jsx)(r,{size:`sm`,variant:`ghost`,onClick:Z,disabled:R||w,children:R?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(m,{className:`h-4 w-4 mr-1 animate-spin`}),`读取中`]}):(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(c,{className:`h-4 w-4 mr-1`}),`刷新代码`]})})]})]}),z?(0,y.jsx)(`div`,{className:`rounded-md border border-red-200 bg-red-50/80 p-3 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/20 dark:text-red-300`,children:z}):ke===`diff`&&Ne?(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,y.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`左侧是原代码,右侧是 AI 修复后的代码`}),G!==`idle`&&(0,y.jsx)(g,{variant:`outline`,className:`text-xs font-normal`,children:be(G)})]}),(0,y.jsx)(ge,{original:I||P,modified:V||P,language:`javascript`,minHeight:`320px`})]}):(0,y.jsx)(he,{value:w&&V?V:P,onChange:()=>{},language:`javascript`,readOnly:!0,minHeight:`260px`}),(0,y.jsxs)(`div`,{className:`space-y-2 pt-2`,children:[(0,y.jsx)(f,{htmlFor:`plugin-extra-instruction`,children:`额外信息`}),(0,y.jsx)(_e,{id:`plugin-extra-instruction`,value:W,onChange:e=>Ae(e.target.value),placeholder:`例如:补充 onBeforeResponse 里对 JSON 响应的判空逻辑;保留现有 hooks 和 manifest,不要改插件 id。`,className:`min-h-[88px]`,disabled:w||R}),(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,y.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`输入额外要求后,AI 会基于当前插件代码直接更新并热加载。`}),(0,y.jsx)(r,{size:`sm`,variant:`outline`,onClick:async()=>{if(!(!X||!W.trim()||!Y||w)){T(!0),N(null),H(``),L(P);try{K(`generating`);let e=await fetch(`/api/plugins/revise-stream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({originalCode:P,instruction:W.trim(),requirement:{name:b,description:`根据额外要求更新插件 ${b},并保持 hooks 行为正确。Hooks: ${x.join(`, `)}`,hooks:x},aiConfig:je})});if(!e.ok){let t=await e.json();throw Error(t.error||`AI 更新代码失败`)}let t=e.body?.getReader(),n=new TextDecoder;if(!t)throw Error(`无法读取 AI 更新流`);let r=``,i=``;for(;;){let{done:e,value:a}=await t.read();if(e)break;i+=n.decode(a,{stream:!0});let o=i.split(`
|
|
2
|
+
`);i=o.pop()||``;for(let e of o){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t)try{let e=JSON.parse(t);if(e.status===`generating`)N({status:`success`,message:`AI 正在根据额外要求更新插件代码...`});else if(e.chunk)r=e.accumulated||`${r}${e.chunk}`,H(r),U(`diff`);else if(e.status===`success`)r=e.revisedCode||r,H(r),U(`diff`);else if(e.error)throw Error(e.error)}catch(e){if(e instanceof Error&&e.message!==`Unexpected end of JSON input`)throw e}}}if(!r||typeof r!=`string`)throw Error(`AI 未返回有效代码`);N({status:`success`,message:`AI 已生成更新后的代码,正在保存并热加载...`}),await Pe(r,`AI 已根据额外要求更新插件代码并完成热加载。`,!1),Ae(``)}catch(e){N({status:`error`,message:e instanceof Error?e.message:`AI 更新代码失败`})}finally{K(`idle`),T(!1)}}},disabled:!X||!W.trim()||!Y||w||R||!!z,children:w&&G!==`retesting`?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(m,{className:`h-4 w-4 mr-1 animate-spin`}),`AI 更新中...`]}):(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(ee,{className:`h-4 w-4 mr-1`}),`根据额外信息更新代码`]})})]})]})]})]}),O&&(0,y.jsxs)(`div`,{className:`space-y-3`,children:[(0,y.jsx)(p,{}),O.error?(0,y.jsx)(`div`,{className:`bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-900 rounded-md p-3`,children:(0,y.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,y.jsx)(s,{className:`h-4 w-4 text-red-600 mt-0.5 shrink-0`}),(0,y.jsx)(`span`,{className:`text-sm text-red-700 dark:text-red-300`,children:O.error})]})}):(0,y.jsxs)(y.Fragment,{children:[(0,y.jsxs)(`div`,{className:`flex flex-wrap gap-4 items-center rounded-md border bg-muted/20 px-3 py-2`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Header 对比`}),(0,y.jsx)(l,{value:A,onValueChange:e=>Ee(e),children:(0,y.jsxs)(u,{className:`h-7`,children:[(0,y.jsx)(d,{value:`split`,className:`px-2 text-xs`,children:`分栏`}),(0,y.jsx)(d,{value:`inline`,className:`px-2 text-xs`,children:`行内`})]})})]}),(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Body 对比`}),(0,y.jsx)(l,{value:j,onValueChange:e=>De(e),children:(0,y.jsxs)(u,{className:`h-7`,children:[(0,y.jsx)(d,{value:`inline`,className:`px-2 text-xs`,children:`行内`}),(0,y.jsx)(d,{value:`split`,className:`px-2 text-xs`,children:`分栏`})]})})]})]}),O.realRequest&&(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(fe,{className:`h-4 w-4`}),`真实请求`,O.realRequest.testMode&&(0,y.jsx)(g,{variant:`outline`,className:`text-xs font-normal`,children:O.realRequest.testMode===`integrated`?`集成测试`:`单独测试`})]}),(0,y.jsxs)(`div`,{className:`bg-muted/50 rounded-md p-3 text-xs space-y-1`,children:[(0,y.jsxs)(`div`,{className:`flex gap-2`,children:[(0,y.jsx)(g,{variant:`outline`,className:`text-xs`,children:O.realRequest.method}),(0,y.jsx)(`span`,{className:`font-mono break-all`,children:O.realRequest.url})]}),O.realRequest.fetchError?(0,y.jsxs)(`div`,{className:`text-red-600 flex items-center gap-1 mt-1`,children:[(0,y.jsx)(s,{className:`h-3 w-3`}),`请求失败: `,O.realRequest.fetchError]}):(0,y.jsxs)(`div`,{className:`text-muted-foreground space-y-0.5`,children:[(0,y.jsxs)(`div`,{children:[`耗时: `,O.realRequest.fetchDuration,`ms`,O.originalResponse&&(0,y.jsxs)(y.Fragment,{children:[` · 状态码: `,(0,y.jsx)(g,{variant:`outline`,className:`text-xs`,children:O.originalResponse.statusCode}),` · 响应大小: `,O.originalResponse.bodyLength,` 字符`]})]}),(O.realRequest.targetResolved||O.realRequest.usedMock)&&(0,y.jsxs)(`div`,{className:`flex flex-wrap gap-1 mt-1`,children:[O.realRequest.targetResolved&&(0,y.jsx)(g,{variant:`outline`,className:`text-xs text-blue-600 border-blue-300`,children:`路由已改写`}),O.realRequest.usedMock&&(0,y.jsx)(g,{variant:`outline`,className:`text-xs text-orange-600 border-orange-300`,children:`已使用 Mock`})]})]})]})]}),(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(h,{className:`h-4 w-4`}),`Hook 执行结果`]}),Object.keys(O.hookResults||{}).length===0?(0,y.jsx)(`div`,{className:`text-xs text-muted-foreground bg-muted/50 rounded-md p-3`,children:`没有 Hook 被执行`}):(0,y.jsx)(`div`,{className:`space-y-2`,children:Object.entries(O.hookResults||{}).map(([e,t])=>(0,y.jsxs)(`div`,{className:`border rounded-md p-3 ${t.status===`success`?`bg-green-50 dark:bg-green-950/20 border-green-200 dark:border-green-900`:`bg-red-50 dark:bg-red-950/20 border-red-200 dark:border-red-900`}`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[t.status===`success`?(0,y.jsx)(de,{className:`h-4 w-4 text-green-600`}):(0,y.jsx)(s,{className:`h-4 w-4 text-red-600`}),(0,y.jsx)(`span`,{className:`font-medium text-sm`,children:e})]}),t.duration!==void 0&&(0,y.jsxs)(g,{variant:`outline`,className:`text-xs`,children:[t.duration,`ms`]})]}),t.status===`error`&&(0,y.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,y.jsxs)(`div`,{className:`rounded-md border border-red-200 bg-red-100/60 px-2 py-2 text-xs text-red-800 dark:border-red-900 dark:bg-red-950/20 dark:text-red-300`,children:[(0,y.jsx)(`div`,{className:`font-medium mb-1`,children:`错误原因`}),(0,y.jsx)(`pre`,{className:`font-mono whitespace-pre-wrap break-all`,children:t.error})]}),t.stack&&(0,y.jsxs)(`details`,{className:`rounded-md border border-red-200 bg-background/60 px-2 py-2 text-xs dark:border-red-900`,children:[(0,y.jsx)(`summary`,{className:`cursor-pointer text-red-700 dark:text-red-300`,children:`查看错误堆栈`}),(0,y.jsx)(`pre`,{className:`font-mono whitespace-pre-wrap break-all mt-2 text-muted-foreground`,children:t.stack})]})]}),t.targetChanged&&(0,y.jsxs)(`div`,{className:`text-xs text-blue-700 mt-1 flex items-center gap-1`,children:[(0,y.jsx)(a,{className:`h-3 w-3`}),`Target 已修改为: `,t.targetChanged]})]},e))})]}),Q.length>0&&(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(o,{className:`h-4 w-4 text-red-500`}),`错误详情`]}),(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[!Y&&(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`AI 未配置,无法自动修复`}),(0,y.jsx)(r,{size:`sm`,variant:`outline`,onClick:async()=>{if(!(!Me||!Y)){T(!0),N(null),H(``),L(P);try{K(`generating`);let e={code:P};if(!e.code)throw Error(`插件源码为空,无法修复`);let t=Q.map(e=>`Hook: ${e.hookName}\nError: ${e.message}${e.stack?`\nStack:\n${e.stack}`:``}`).join(`
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`),n=await fetch(`/api/plugins/fix-stream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({originalCode:e.code,testError:t,requirement:{name:b,description:`修复插件 ${b} 在测试中的报错,并保持现有 hooks 行为正确。Hooks: ${x.join(`, `)}`,hooks:x},aiConfig:je})});if(!n.ok){let e=await n.json();throw Error(e.error||`AI 修复失败`)}let r=n.body?.getReader(),i=new TextDecoder;if(!r)throw Error(`无法读取 AI 修复流`);let a=``,o=``;for(;;){let{done:e,value:t}=await r.read();if(e)break;o+=i.decode(t,{stream:!0});let n=o.split(`
|
|
7
|
+
`);o=n.pop()||``;for(let e of n){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t)try{let e=JSON.parse(t);if(e.status===`generating`)N({status:`success`,message:`AI 正在分析错误并生成修复代码...`});else if(e.chunk)a=e.accumulated||`${a}${e.chunk}`,H(a);else if(e.status===`success`)a=e.fixedCode||a,H(a);else if(e.error)throw Error(e.error)}catch(e){if(e instanceof Error&&e.message!==`Unexpected end of JSON input`)throw e}}}if(!a||typeof a!=`string`)throw Error(`AI 未返回有效代码`);N({status:`success`,message:`AI 已生成修复代码,正在保存、热加载并重新测试...`}),await Pe(a,`AI 已修复插件代码并完成热加载,测试结果已刷新。`,!0)}catch(e){N({status:`error`,message:e instanceof Error?e.message:`AI 修复失败`})}finally{K(`idle`),T(!1)}}},disabled:!Me||!Y||w||C,children:w?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(m,{className:`h-4 w-4 mr-1 animate-spin`}),`AI 修复中...`]}):(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(te,{className:`h-4 w-4 mr-1`}),`AI 修复并更新代码`]})})]})]}),(0,y.jsx)(`div`,{className:`space-y-2`,children:Q.map((e,t)=>(0,y.jsxs)(`div`,{className:`rounded-md border border-red-200 bg-red-50/80 p-3 dark:border-red-900 dark:bg-red-950/20`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2 mb-2`,children:[(0,y.jsx)(g,{variant:`outline`,className:`text-xs`,children:e.hookName}),(0,y.jsx)(`span`,{className:`text-xs text-red-700 dark:text-red-300`,children:`错误原因`})]}),(0,y.jsx)(`pre`,{className:`text-xs font-mono whitespace-pre-wrap break-all text-red-800 dark:text-red-300`,children:e.message}),e.stack&&(0,y.jsxs)(`details`,{className:`mt-2 text-xs`,children:[(0,y.jsx)(`summary`,{className:`cursor-pointer text-muted-foreground`,children:`查看完整堆栈`}),(0,y.jsx)(`pre`,{className:`font-mono whitespace-pre-wrap break-all mt-2 text-muted-foreground`,children:e.stack})]})]},`${e.hookName}-${t}`))}),M&&(0,y.jsx)(`div`,{className:`rounded-md border px-3 py-2 text-sm ${M.status===`success`?`border-green-200 bg-green-50 text-green-700 dark:border-green-900 dark:bg-green-950/20 dark:text-green-300`:`border-red-200 bg-red-50 text-red-700 dark:border-red-900 dark:bg-red-950/20 dark:text-red-300`}`,children:(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[M.status===`success`?(0,y.jsx)(c,{className:`h-4 w-4`}):(0,y.jsx)(se,{className:`h-4 w-4`}),(0,y.jsx)(`span`,{children:M.message})]})})]}),(O.requestHeadersChanged||O.requestBodyChanged)&&O.originalRequest&&O.modifiedRequest&&(0,y.jsxs)(`div`,{className:`space-y-3`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(ue,{className:`h-4 w-4`}),`请求对比(已被插件修改)`]}),O.requestHeadersChanged&&(0,y.jsxs)(`div`,{className:`space-y-1`,children:[(0,y.jsx)(`div`,{className:`text-xs font-medium text-muted-foreground`,children:`Request Headers`}),(0,y.jsx)(ye,{original:O.originalRequest.headers,modified:O.modifiedRequest.headers,mode:A})]}),O.requestBodyChanged&&(0,y.jsxs)(`div`,{className:`space-y-1`,children:[(0,y.jsx)(`div`,{className:`text-xs font-medium text-muted-foreground`,children:`Request Body`}),(0,y.jsx)(_,{original:O.originalRequest.body||``,modified:O.modifiedRequest.body||``,mode:j,maxHeight:`180px`})]})]}),O.responseHeadersChanged&&O.originalResponse?.headers&&O.modifiedResponse?.headers&&(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(o,{className:`h-4 w-4 text-orange-500`}),`Response Headers 对比(已被插件修改)`]}),(0,y.jsx)(ye,{original:O.originalResponse.headers,modified:O.modifiedResponse.headers,mode:A})]}),O.modifiedResponse&&O.originalResponse&&(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[O.modifiedResponse.bodyChanged?(0,y.jsx)(o,{className:`h-4 w-4 text-orange-500`}):(0,y.jsx)(de,{className:`h-4 w-4 text-muted-foreground`}),`响应 Body`,O.modifiedResponse.bodyChanged?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(g,{className:`text-xs bg-orange-100 text-orange-700 border-orange-300`,children:`已修改`}),(0,y.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[`(差异 `,O.modifiedResponse.bodyLength-O.originalResponse.bodyLength>0?`+`:``,O.modifiedResponse.bodyLength-O.originalResponse.bodyLength,` 字符)`]})]}):(0,y.jsx)(g,{variant:`outline`,className:`text-xs text-muted-foreground`,children:`未变化`})]}),O.modifiedResponse.bodyChanged?(0,y.jsxs)(`div`,{className:`space-y-1`,children:[(0,y.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`绿色=新增行,红色=删除行。仅对比前约 2500 字符以保障性能。`}),(0,y.jsx)(_,{original:O.originalResponse.bodyForDiff??O.originalResponse.bodyPreview??``,modified:O.modifiedResponse.bodyForDiff??O.modifiedResponse.bodyPreview??``,mode:j,maxHeight:`320px`})]}):(0,y.jsx)(`pre`,{className:`bg-muted/50 rounded-md p-2 text-xs font-mono max-h-[200px] overflow-auto whitespace-pre-wrap break-all`,children:O.originalResponse.bodyPreview})]}),O.shortCircuited&&O.shortCircuitResponse&&(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(o,{className:`h-4 w-4 text-blue-500`}),`插件短路了请求(未发起真实请求)`]}),(0,y.jsx)(`div`,{className:`bg-blue-50 dark:bg-blue-950/20 border border-blue-200 dark:border-blue-900 rounded-md p-3`,children:(0,y.jsxs)(`div`,{className:`text-xs`,children:[(0,y.jsxs)(`div`,{children:[`状态码: `,O.shortCircuitResponse.statusCode]}),(0,y.jsx)(`pre`,{className:`mt-2 font-mono whitespace-pre-wrap break-all max-h-[200px] overflow-auto`,children:O.shortCircuitResponse.body})]})})]}),O.logs&&O.logs.length>0&&(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsx)(`h3`,{className:`text-sm font-medium`,children:`插件日志`}),(0,y.jsx)(`div`,{className:`bg-muted rounded-md p-3 max-h-[200px] overflow-auto`,children:(0,y.jsx)(`div`,{className:`space-y-1`,children:O.logs.map((e,t)=>(0,y.jsxs)(`div`,{className:`text-xs font-mono`,children:[(0,y.jsxs)(`span`,{className:`inline-block w-12 ${e.level===`error`?`text-red-600`:e.level===`warn`?`text-yellow-600`:e.level===`info`?`text-blue-600`:`text-muted-foreground`}`,children:[`[`,e.level,`]`]}),(0,y.jsx)(`span`,{className:`text-foreground`,children:e.message})]},t))})})]})]})]})]}),(0,y.jsx)(p,{}),(0,y.jsxs)(`div`,{className:`px-6 py-4 flex justify-between gap-2`,children:[(0,y.jsx)(r,{variant:`outline`,size:`sm`,onClick:()=>t?.(!1),disabled:C,children:`关闭`}),(0,y.jsx)(r,{size:`sm`,onClick:Fe,disabled:C,children:C?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(m,{className:`h-4 w-4 mr-1 animate-spin`}),`请求中...`]}):(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(ve,{className:`h-4 w-4 mr-1`}),`发起测试请求`]})})]})]});return n?(0,y.jsx)(`div`,{className:`flex h-full min-h-0 flex-col`,children:$}):(0,y.jsx)(le,{open:e,onOpenChange:e=>t?.(e),children:(0,y.jsx)(ce,{className:`p-0 flex flex-col`,resizable:!0,defaultWidth:900,storageKey:`plugin-test`,children:$})})}export{C as PluginTestDialog};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{l as e}from"./button-BTToMaBW.js";var t=e(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]);export{t};
|