diff --git a/README.md b/README.md index 18327469..f6a82cbc 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@

- + + maven diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/pom.xml b/magic-api-plugins/magic-api-plugin-rocketmq/pom.xml new file mode 100644 index 00000000..6325884e --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + + org.ssssssss + magic-api-plugins + 2.1.1 + + magic-api-plugin-rocketmq + jar + magic-api-plugin-rocketmq + magic-api-plugin-rocketmq + + + + org.apache.rocketmq + rocketmq-spring-boot-starter + 2.2.3 + + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + exec-npm-install + generate-resources + + exec + + + npm + + install + + ${basedir}/src/console + + + + exec-npm-run-build + generate-resources + + exec + + + npm + + run + build + + ${basedir}/src/console + + + + + + + + maven-resources-plugin + 3.2.0 + + + copy-resource + generate-resources + + copy-resources + + + ${basedir}/target/classes/magic-editor/plugins + + + ${basedir}/src/console/dist + + + + + + + + + diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/console/dist/magic-rocketmq.1.0.0.iife.js b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/dist/magic-rocketmq.1.0.0.iife.js new file mode 100644 index 00000000..ca412770 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/dist/magic-rocketmq.1.0.0.iife.js @@ -0,0 +1,190 @@ +var __vite_style__ = document.createElement("style"); +__vite_style__.innerHTML = "\n.magic-rocketmq-info[data-v-1628ca62]{\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1;\r\n padding: 5px;\n}\n.magic-rocketmq-info form[data-v-1628ca62]{\r\n display: flex;\n}\n.magic-rocketmq-info form label[data-v-1628ca62]{\r\n display: inline-block;\r\n width: 100px;\r\n height: var(--magic-input-height);\r\n line-height: var(--magic-input-height);\r\n font-weight: 400;\r\n text-align: right;\r\n padding: 0 5px;\n}\n.magic-rocketmq-info form[data-v-1628ca62] .magic-checkbox{\r\n width: 22px;\r\n height: 22px;\n}\n.magic-rocketmq-info form[data-v-1628ca62] .magic-textarea{\r\n margin: 5px;\n}\r\n"; +document.head.appendChild(__vite_style__); +var MagicRocketMq = function(vue) { + "use strict"; + function MagicRocketMq2(bus, constants, $i, Message, request) { + return { + getIcon: (item) => ["ROCKETMQ", "#9012FE"], + name: $i("rocketmq.name"), + language: "magicscript", + defaultScript: `return 'Hello magic-api-rocketmq'`, + doTest: (opened) => { + opened.running = true; + const info = opened.item; + const requestConfig = { + baseURL: constants.SERVER_URL, + url: "/rocketmq/execute", + method: "POST", + responseType: "json", + headers: {}, + withCredentials: true + }; + bus.$emit(Message.SWITCH_TOOLBAR, "log"); + requestConfig.headers[constants.HEADER_REQUEST_CLIENT_ID] = constants.CLIENT_ID; + requestConfig.headers[constants.HEADER_REQUEST_SCRIPT_ID] = opened.item.id; + requestConfig.headers[constants.HEADER_MAGIC_TOKEN] = constants.HEADER_MAGIC_TOKEN_VALUE; + requestConfig.headers[constants.HEADER_REQUEST_BREAKPOINTS] = (opened.decorations || []).filter((it) => it.options.linesDecorationsClassName === "breakpoints").map((it) => it.range.startLineNumber).join(","); + const fullName = opened.path(); + bus.status(`\u5F00\u59CB\u6D4B\u8BD5\u5B9A\u65F6\u4EFB\u52A1\u300C${fullName}\u300D`); + request.sendPost("/rocketmq/execute", { id: info.id }, requestConfig).success((res) => { + opened.running = false; + }).end(() => { + bus.status(`\u5B9A\u65F6\u4EFB\u52A1\u300C${fullName}\u300D\u6D4B\u8BD5\u5B8C\u6BD5`); + opened.running = false; + }); + }, + runnable: true, + requirePath: true, + merge: (item) => item + }; + } + var localZhCN = { + rocketmq: { + title: "RocketMq\u4FE1\u606F", + name: "RocketMq", + form: { + topic: " \u4E3B\u9898", + tag: "\u6807\u7B7E", + name: "\u540D\u79F0", + path: "\u8DEF\u5F84", + placeholder: { + topic: "\u8BF7\u8F93\u5165\u6D88\u606F\u961F\u5217\u4E3B\u9898", + tag: "\u8BF7\u8F93\u5165\u6D88\u606F\u961F\u5217\u6807\u7B7E", + name: "\u8BF7\u8F93\u5165\u6D88\u606F\u961F\u5217\u540D\u79F0", + path: "\u8BF7\u8F93\u5165\u6D88\u606F\u961F\u5217\u8DEF\u5F84", + description: "\u8BF7\u8F93\u5165\u6D88\u606F\u961F\u5217\u63CF\u8FF0" + } + } + } + }; + var localEn = { + rocketmq: { + title: "RocketMq Info", + name: "RocketMq", + form: { + topic: " topic", + tag: "tag", + name: "name", + path: "path", + placeholder: { + topic: "Please Enter Topic Expression", + tag: "Please Enter tag Expression", + name: "Please Enter RocketMq Name", + path: "Please Enter RocketMq Path", + description: "Please Enter RocketMq Description" + } + } + } + }; + var magicRocketmqInfo_vue_vue_type_style_index_0_scoped_true_lang = ""; + var _export_sfc = (sfc, props) => { + const target = sfc.__vccOpts || sfc; + for (const [key, val] of props) { + target[key] = val; + } + return target; + }; + const _hoisted_1 = { class: "magic-rocketmq-info" }; + const _hoisted_2 = { style: { "flex": "1", "padding-top": "5px" } }; + const _sfc_main = { + __name: "magic-rocketmq-info", + setup(__props) { + const $i = vue.inject("i18n.format"); + const info = vue.inject("info"); + return (_ctx, _cache) => { + const _component_magic_checkbox = vue.resolveComponent("magic-checkbox"); + const _component_magic_input = vue.resolveComponent("magic-input"); + const _component_magic_textarea = vue.resolveComponent("magic-textarea"); + return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [ + vue.createElementVNode("form", null, [ + vue.createElementVNode("label", null, vue.toDisplayString(vue.unref($i)("message.enable")), 1), + vue.createVNode(_component_magic_checkbox, { + value: vue.unref(info).enabled, + "onUpdate:value": _cache[0] || (_cache[0] = ($event) => vue.unref(info).enabled = $event) + }, null, 8, ["value"]), + vue.createElementVNode("label", null, vue.toDisplayString(vue.unref($i)("rocketmq.form.topic")), 1), + vue.createVNode(_component_magic_input, { + value: vue.unref(info).topic, + "onUpdate:value": _cache[1] || (_cache[1] = ($event) => vue.unref(info).topic = $event), + placeholder: vue.unref($i)("rocketmq.form.placeholder.topic"), + width: "250px" + }, null, 8, ["value", "placeholder"]), + vue.createElementVNode("label", null, vue.toDisplayString(vue.unref($i)("rocketmq.form.tag")), 1), + vue.createVNode(_component_magic_input, { + value: vue.unref(info).tag, + "onUpdate:value": _cache[2] || (_cache[2] = ($event) => vue.unref(info).tag = $event), + placeholder: vue.unref($i)("rocketmq.form.placeholder.tag"), + width: "250px" + }, null, 8, ["value", "placeholder"]), + vue.createElementVNode("label", null, vue.toDisplayString(vue.unref($i)("rocketmq.form.name")), 1), + vue.createVNode(_component_magic_input, { + value: vue.unref(info).name, + "onUpdate:value": _cache[3] || (_cache[3] = ($event) => vue.unref(info).name = $event), + placeholder: vue.unref($i)("rocketmq.form.placeholder.name"), + width: "250px" + }, null, 8, ["value", "placeholder"]), + vue.createElementVNode("label", null, vue.toDisplayString(vue.unref($i)("rocketmq.form.path")), 1), + vue.createVNode(_component_magic_input, { + value: vue.unref(info).path, + "onUpdate:value": _cache[4] || (_cache[4] = ($event) => vue.unref(info).path = $event), + placeholder: vue.unref($i)("rocketmq.form.placeholder.path"), + width: "auto", + style: { "flex": "1" } + }, null, 8, ["value", "placeholder"]) + ]), + vue.createElementVNode("div", _hoisted_2, [ + vue.createVNode(_component_magic_textarea, { + value: vue.unref(info).description, + "onUpdate:value": _cache[5] || (_cache[5] = ($event) => vue.unref(info).description = $event), + placeholder: vue.unref($i)("rocketmq.form.placeholder.description") + }, null, 8, ["value", "placeholder"]) + ]) + ]); + }; + } + }; + var MagicRocketMqInfo = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-1628ca62"]]); + if (typeof window !== "undefined") { + let loadSvg = function() { + var body = document.body; + var svgDom = document.getElementById("__svg__icons__dom__1705386927094__"); + if (!svgDom) { + svgDom = document.createElementNS("http://www.w3.org/2000/svg", "svg"); + svgDom.style.position = "absolute"; + svgDom.style.width = "0"; + svgDom.style.height = "0"; + svgDom.id = "__svg__icons__dom__1705386927094__"; + svgDom.setAttribute("xmlns", "http://www.w3.org/2000/svg"); + svgDom.setAttribute("xmlns:link", "http://www.w3.org/1999/xlink"); + } + svgDom.innerHTML = ''; + body.insertBefore(svgDom, body.firstChild); + }; + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", loadSvg); + } else { + loadSvg(); + } + } + var index = (opt) => { + const i18n = opt.i18n; + i18n.add("zh-cn", localZhCN); + i18n.add("en", localEn); + return { + resource: [{ + type: "rocketmq", + icon: "#magic-rocketmq-rocketmq", + title: "rocketmq.name", + service: MagicRocketMq2(opt.bus, opt.constants, i18n.format, opt.Message, opt.request) + }], + toolbars: [{ + type: "rocketmq", + title: "rocketmq.title", + icon: "parameter", + component: MagicRocketMqInfo + }] + }; + }; + return index; +}(Vue); diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/console/package-lock.json b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/package-lock.json new file mode 100644 index 00000000..52e6fdfc --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/package-lock.json @@ -0,0 +1,2026 @@ +{ + "name": "magic-rocketmq", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true + }, + "@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "dev": true, + "optional": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/node": { + "version": "20.11.0", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.11.0.tgz", + "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@vitejs/plugin-vue": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz", + "integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==", + "dev": true + }, + "@vue/compiler-core": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.10.tgz", + "integrity": "sha512-53vxh7K9qbx+JILnGEhrFRyr7H7e4NdT8RuTNU3m6HhJKFvcAqFTNXpYMHnyuAzzRGdsbsYHBgQC3H6xEXTG6w==", + "dev": true, + "requires": { + "@babel/parser": "^7.23.6", + "@vue/shared": "3.4.10", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + }, + "dependencies": { + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + } + } + }, + "@vue/compiler-dom": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.10.tgz", + "integrity": "sha512-QAALBJksIFpXGYuo74rtMgnwpVZDvd3kYbUa4gYX9s/5QiqEvZSgbKtOdUGydXcxKPt3ifC+0/bhPVHXN2694A==", + "dev": true, + "requires": { + "@vue/compiler-core": "3.4.10", + "@vue/shared": "3.4.10" + } + }, + "@vue/compiler-sfc": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.10.tgz", + "integrity": "sha512-sTOssaQySgrMjrhZxmAqdp6n+E51VteIVIDaOR537H2P63DyzMmig21U0XXFxiXmMIfrK91lAInnc+bIAYemGw==", + "dev": true, + "requires": { + "@babel/parser": "^7.23.6", + "@vue/compiler-core": "3.4.10", + "@vue/compiler-dom": "3.4.10", + "@vue/compiler-ssr": "3.4.10", + "@vue/shared": "3.4.10", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.32", + "source-map-js": "^1.0.2" + } + }, + "@vue/compiler-ssr": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.10.tgz", + "integrity": "sha512-Y90TL1abretWbUiK5rv+9smS1thCHE5sSuhZgiLh6cxgZ2Pcy3BEvDd3reID0iwNcTdMbTeE6NI3Aq4Mux6hqQ==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.4.10", + "@vue/shared": "3.4.10" + } + }, + "@vue/reactivity": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.10.tgz", + "integrity": "sha512-SmGGpo37LzPcAFTopHNIJRNVOQfma9YgyPkAzx9/TJ01lbCCYigS28hEcY1hjiJ1PRK8iVX62Ov5yzmUgYH/pQ==", + "dev": true, + "requires": { + "@vue/shared": "3.4.10" + } + }, + "@vue/runtime-core": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.10.tgz", + "integrity": "sha512-Ri2Cz9sFr66AEUewGUK8IXhIUAhshTHVUGuJR8pqMbtjIds+zPa8QPO5UZImGMQ8HTY7eEpKwztCct9V3+Iqug==", + "dev": true, + "requires": { + "@vue/reactivity": "3.4.10", + "@vue/shared": "3.4.10" + } + }, + "@vue/runtime-dom": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.10.tgz", + "integrity": "sha512-ROsdi5M2niRDmjXJNZ8KKiGwXyG1FO8l9n6sCN0kaJEHbjWkuigu96YAI3fK/AWUZPSXXEcMEBVPC6rL3mmUuA==", + "dev": true, + "requires": { + "@vue/runtime-core": "3.4.10", + "@vue/shared": "3.4.10", + "csstype": "^3.1.3" + } + }, + "@vue/server-renderer": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.10.tgz", + "integrity": "sha512-WpCBAhesLq44JKWfdFqb+Bi4ACUW0d8x1z90GnE0spccsAlEDMXV5nm+pwXLyW0OdP2iPrO/n/QMJh4B1v9Ciw==", + "dev": true, + "requires": { + "@vue/compiler-ssr": "3.4.10", + "@vue/shared": "3.4.10" + } + }, + "@vue/shared": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.10.tgz", + "integrity": "sha512-C0mIVhwW1xQLMFyqMJxnhq6fWyE02lCgcE+TDdtGpg6B3H6kh/0YcqS54qYc76UJNlWegf3VgsLqgk6D9hBmzQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + }, + "dependencies": { + "is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + } + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "dev": true, + "requires": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" + } + }, + "esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "dev": true, + "optional": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.1" + } + }, + "micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "dev": true, + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "dev": true + }, + "posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmmirror.com/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dev": true, + "requires": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + } + }, + "posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dev": true, + "requires": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true + }, + "posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "requires": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rollup": { + "version": "2.77.3", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.77.3.tgz", + "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + }, + "dependencies": { + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + } + } + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmmirror.com/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "dev": true + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "vite": { + "version": "2.9.16", + "resolved": "https://registry.npmmirror.com/vite/-/vite-2.9.16.tgz", + "integrity": "sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA==", + "dev": true, + "requires": { + "esbuild": "^0.14.27", + "fsevents": "~2.3.2", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": ">=2.59.0 <2.78.0" + } + }, + "vite-plugin-svg-icons": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/vite-plugin-svg-icons/-/vite-plugin-svg-icons-1.1.0.tgz", + "integrity": "sha512-dmpr7Wq8vQN6ajBrVTrBxy8wJjQfcP30i73q+40uAZc8p7EwphBNZ+bVTI0enFaCrsITI8y0Ruo/mN/SaJQ6Hw==", + "dev": true, + "requires": { + "@types/svgo": "^2.6.0", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + } + }, + "vue": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.10.tgz", + "integrity": "sha512-c+O8qGqdWPF9joTCzMGeDDedViooh6c8RY3+eW5+6GCAIY8YjChmU06LsUu0PnMZbIk1oKUoJTqKzmghYtFypw==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.4.10", + "@vue/compiler-sfc": "3.4.10", + "@vue/runtime-dom": "3.4.10", + "@vue/server-renderer": "3.4.10", + "@vue/shared": "3.4.10" + } + } + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/console/package.json b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/package.json new file mode 100644 index 00000000..fc543240 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/package.json @@ -0,0 +1,18 @@ +{ + "name": "magic-rocketmq", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "vite build" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "vue": "^3.2.31", + "@vitejs/plugin-vue": "^2.2.4", + "vite-plugin-svg-icons": "^1.1.0", + "vite": "^2.8.6" + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/components/magic-rocketmq-info.vue b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/components/magic-rocketmq-info.vue new file mode 100644 index 00000000..cbabd904 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/components/magic-rocketmq-info.vue @@ -0,0 +1,51 @@ + + + diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/i18n/en.js b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/i18n/en.js new file mode 100644 index 00000000..41b0ab5c --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/i18n/en.js @@ -0,0 +1,19 @@ +export default { + rocketmq: { + title: 'RocketMq Info', + name: 'RocketMq', + form: { + topic: " topic", + tag: "tag", + name: 'name', + path: 'path', + placeholder: { + topic: 'Please Enter Topic Expression', + tag: 'Please Enter tag Expression', + name: 'Please Enter RocketMq Name', + path: 'Please Enter RocketMq Path', + description: 'Please Enter RocketMq Description' + } + } + }, +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/i18n/zh-cn.js b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/i18n/zh-cn.js new file mode 100644 index 00000000..109f9303 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/i18n/zh-cn.js @@ -0,0 +1,19 @@ +export default { + rocketmq: { + title: 'RocketMq信息', + name: 'RocketMq', + form: { + topic: " 主题", + tag: "标签", + name: '名称', + path: '路径', + placeholder: { + topic: '请输入消息队列主题', + tag: '请输入消息队列标签', + name: '请输入消息队列名称', + path: '请输入消息队列路径', + description: '请输入消息队列描述' + } + } + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/icons/rocketmq.svg b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/icons/rocketmq.svg new file mode 100644 index 00000000..375e53e0 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/icons/rocketmq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/index.js b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/index.js new file mode 100644 index 00000000..e99aa160 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/index.js @@ -0,0 +1,35 @@ +import MagicRocketMq from './service/magic-rocketmq.js' +import localZhCN from './i18n/zh-cn.js' +import localEn from './i18n/en.js' +import MagicRocketMqInfo from './components/magic-rocketmq-info.vue' +import 'vite-plugin-svg-icons/register' +export default (opt) => { + const i18n = opt.i18n + // 添加i18n 国际化信息 + i18n.add('zh-cn', localZhCN) + i18n.add('en', localEn) + return { + // 左侧资源 + resource: [{ + // 资源类型,和后端存储结构一致 + type: 'rocketmq', + // 展示图标 + icon: '#magic-rocketmq-rocketmq', // #开头表示图标在插件中 + // 展示名称 + title: 'rocketmq.name', + // 运行服务 + service: MagicRocketMq(opt.bus, opt.constants, i18n.format, opt.Message, opt.request), + }], + // 底部工具条 + toolbars: [{ + // 当打开的资源类型为 task 时显示 + type: 'rocketmq', + // 工具条展示的标题 + title: 'rocketmq.title', + // 展示图标 + icon: 'parameter', + // 对应的组件 + component: MagicRocketMqInfo, + }] + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/service/magic-rocketmq.js b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/service/magic-rocketmq.js new file mode 100644 index 00000000..bf12dd53 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/src/service/magic-rocketmq.js @@ -0,0 +1,45 @@ +export default function (bus, constants, $i, Message, request) { + return { + // svg text + getIcon: item => ['ROCKETMQ', '#9012FE'], + // 任务名称 + name: $i('rocketmq.name'), + // 脚本语言 + language: 'magicscript', + // 默认脚本 + defaultScript: `return 'Hello magic-api-rocketmq'`, + // 执行测试的逻辑 + doTest: (opened) => { + opened.running = true + const info = opened.item + const requestConfig = { + baseURL: constants.SERVER_URL, + url: '/rocketmq/execute', + method: 'POST', + responseType: 'json', + headers: {}, + withCredentials: true + } + bus.$emit(Message.SWITCH_TOOLBAR, 'log') + requestConfig.headers[constants.HEADER_REQUEST_CLIENT_ID] = constants.CLIENT_ID + requestConfig.headers[constants.HEADER_REQUEST_SCRIPT_ID] = opened.item.id + requestConfig.headers[constants.HEADER_MAGIC_TOKEN] = constants.HEADER_MAGIC_TOKEN_VALUE + // 设置断点 + requestConfig.headers[constants.HEADER_REQUEST_BREAKPOINTS] = (opened.decorations || []).filter(it => it.options.linesDecorationsClassName === 'breakpoints').map(it => it.range.startLineNumber).join(',') + const fullName = opened.path() + bus.status(`开始测试定时任务「${fullName}」`) + request.sendPost('/rocketmq/execute', { id: info.id }, requestConfig).success(res => { + opened.running = false + }).end(() => { + bus.status(`定时任务「${fullName}」测试完毕`) + opened.running = false + }) + }, + // 是否允许执行测试 + runnable: true, + // 是否需要填写路径 + requirePath: true, + // 合并 + merge: item => item + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/console/vite.config.js b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/vite.config.js new file mode 100644 index 00000000..14548164 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/console/vite.config.js @@ -0,0 +1,37 @@ +import vue from '@vitejs/plugin-vue' +import viteSvgIcons from 'vite-plugin-svg-icons' +import path from 'path' +import pkg from './package.json' + +export default { + base: './', + build: { + minify: false, + cssCodeSplit: true, // 将组件的 style 打包到 js 文件中 + outDir: 'dist', + lib: { + target: 'esnext', + formats: ['iife'], + entry: path.resolve(__dirname, 'src/index.js'), + name: 'MagicRocketMq', + fileName: (format) => `magic-rocketmq.${pkg.version}.${format}.js` + }, + rollupOptions: { + // 确保外部化处理那些你不想打包进库的依赖 + external: ['vue'], + output: { + // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量 + globals: { + vue: 'Vue' + } + } + } + }, + plugins: [ + vue(), + viteSvgIcons({ + iconDirs: [path.resolve(process.cwd(), 'src/icons')], + symbolId: 'magic-rocketmq-[name]' + }), + ] +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/consumer/RocketMQConsumer.java b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/consumer/RocketMQConsumer.java new file mode 100644 index 00000000..be791476 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/consumer/RocketMQConsumer.java @@ -0,0 +1,68 @@ +package org.ssssssss.magicapi.rocketmq.consumer; + +import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; +import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.common.message.MessageExt; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.ssssssss.magicapi.rocketmq.service.RocketMqService; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author zzy + */ + +public class RocketMQConsumer { + + Logger logger = LoggerFactory.getLogger(RocketMQConsumer.class); + private static Map consumerMap; + + private final String namesrvAddr; + + private final RocketMqService rocketMqService; + + public RocketMQConsumer(String namesrvAddr, RocketMqService rocketMqService) { + consumerMap = new HashMap<>(); + this.namesrvAddr = namesrvAddr; + this.rocketMqService = rocketMqService; + } + + public void subscribe(String topic, String tag, String scriptName, String script) throws MQClientException { + DefaultMQPushConsumer defaultMQPushConsumer = new DefaultMQPushConsumer(topic + "-" + tag); + defaultMQPushConsumer.setNamesrvAddr(namesrvAddr); + // 订阅主题和Tag过滤模式,使用*表示全量订阅。 + defaultMQPushConsumer.subscribe(topic, tag); + defaultMQPushConsumer.setInstanceName(topic + "-" + tag); + defaultMQPushConsumer.setConsumeMessageBatchMaxSize(1); + // 注册监听器。 + defaultMQPushConsumer.registerMessageListener(new MessageListenerConcurrently() { + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + for (MessageExt msg : msgs) { + logger.info("Received message: " + new String(msg.getBody())); + if (!rocketMqService.consume(scriptName, script, msg)) { + return ConsumeConcurrentlyStatus.RECONSUME_LATER; + } + } + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + }); + defaultMQPushConsumer.start(); + consumerMap.put(topic + "-" + tag, defaultMQPushConsumer); + } + + public void unsubscribe(String topic, String tag) { + DefaultMQPushConsumer defaultMQPushConsumer = consumerMap.get(topic + "-" + tag); + if (defaultMQPushConsumer != null) { + defaultMQPushConsumer.unsubscribe(topic); + defaultMQPushConsumer.shutdown(); + consumerMap.remove(topic + "-" + tag); + } + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/model/RocketMqInfo.java b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/model/RocketMqInfo.java new file mode 100644 index 00000000..d5bab8f0 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/model/RocketMqInfo.java @@ -0,0 +1,106 @@ +package org.ssssssss.magicapi.rocketmq.model; + + +import org.ssssssss.magicapi.core.model.MagicEntity; +import org.ssssssss.magicapi.core.model.PathMagicEntity; + +import java.util.Objects; + +/** + * @author zzy + */ +public class RocketMqInfo extends PathMagicEntity { + + /** + * 主题 + */ + private String topic; + + /** + * 标签 + */ + private String tag; + + + /** + * 是否启用 + */ + private boolean enabled; + + + /** + * 消息队列描述 + */ + private String description; + + + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public RocketMqInfo copy() { + RocketMqInfo info = new RocketMqInfo(); + super.copyTo(info); + info.setTopic(this.topic); + info.setTag(this.tag); + info.setEnabled(this.enabled); + info.setDescription(this.description); + return info; + } + + @Override + public MagicEntity simple() { + RocketMqInfo info = new RocketMqInfo(); + super.simple(info); + return info; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + RocketMqInfo rocketMqInfo = (RocketMqInfo) o; + return Objects.equals(id, rocketMqInfo.id) && + Objects.equals(path, rocketMqInfo.path) && + Objects.equals(script, rocketMqInfo.script) && + Objects.equals(name, rocketMqInfo.name) && + Objects.equals(topic, rocketMqInfo.topic) && + Objects.equals(tag, rocketMqInfo.tag) && + Objects.equals(description, rocketMqInfo.description) && + Objects.equals(enabled, rocketMqInfo.enabled); + } + + @Override + public int hashCode() { + return Objects.hash(id, path, script, name, groupId, topic, tag, enabled, description); + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/product/RocketMqModule.java b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/product/RocketMqModule.java new file mode 100644 index 00000000..4c960f8e --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/product/RocketMqModule.java @@ -0,0 +1,91 @@ +package org.ssssssss.magicapi.rocketmq.product; + +import org.apache.rocketmq.client.producer.SendCallback; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.ssssssss.magicapi.core.annotation.MagicModule; +import org.ssssssss.magicapi.rocketmq.service.RocketMqService; +import org.ssssssss.script.annotation.Comment; + +/** + * rocketMq模块 + * + * @author zzy + */ +@MagicModule("rocketMq") +public class RocketMqModule { + + private final RocketMQTemplate rocketMQTemplate; + + private final RocketMqService rocketMqService; + + public RocketMqModule(RocketMQTemplate rocketMQTemplate, RocketMqService rocketMqService) { + this.rocketMQTemplate = rocketMQTemplate; + this.rocketMqService = rocketMqService; + } + + /** + * 同步发送实体对象消息 + * 可靠同步发送:同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才发下一个数据包的通讯方式; + * 特点:速度快;有结果反馈;数据可靠; + * 应用场景:应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等; + */ + @Comment("同步发送实体对象消息") + public boolean send(String topic, String tag, Object msg) { + rocketMqService.beforeProduce(topic, tag, msg); + SendResult sendResult = rocketMQTemplate.syncSend(topic + ":" + tag, msg); + if (sendResult.getSendStatus() != SendStatus.SEND_OK) { + rocketMqService.failProduce(topic, tag, msg); + return false; + } + rocketMqService.afterProduce(topic, tag, msg); + return true; + } + + /** + * 异步发送消息 + * 可靠异步发送:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式; + * 特点:速度快;有结果反馈;数据可靠; + * 应用场景:异步发送一般用于链路耗时较长,对 rt响应时间较为敏感的业务场景,例如用户视频上传后通知启动转码服务,转码完成后通知推送转码结果等; + * + * @param msg + * @return + */ + @Comment("异步发送消息") + public boolean asyncSend(String topic, String tag, Object msg) { + rocketMqService.beforeProduce(topic, tag, msg); + rocketMQTemplate.asyncSend(topic + ":" + tag, msg, new SendCallback() { + @Override + public void onSuccess(SendResult var1) { + // 成功回调 + rocketMqService.afterProduce(topic, tag, msg); + } + + @Override + public void onException(Throwable var1) { + // 失败回调 + rocketMqService.failProduce(topic, tag, msg); + } + }); + return true; + } + + /** + * 单向发送 + * 单向发送:只负责发送消息,不等待服务器回应且没有回调函数触发,即只发送请求不等待应答;此方式发送消息的过程耗时非常短,一般在微秒级别; + * 特点:速度最快,耗时非常短,毫秒级别;无结果反馈;数据不可靠,可能会丢失; + * 应用场景:适用于某些耗时非常短,但对可靠性要求并不高的场景,例如日志收集; + * + * @return + */ + @Comment("单向发送") + public boolean sendOneway(String topic, String tag, Object msg) { + rocketMqService.beforeProduce(topic, tag, msg); + rocketMQTemplate.sendOneWay(topic + ":" + tag, msg); + rocketMqService.afterProduce(topic, tag, msg); + return true; + } + + +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/DefaultRocketMqService.java b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/DefaultRocketMqService.java new file mode 100644 index 00000000..1448ce39 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/DefaultRocketMqService.java @@ -0,0 +1,43 @@ +package org.ssssssss.magicapi.rocketmq.service; + + +import org.apache.rocketmq.common.message.MessageExt; +import org.ssssssss.magicapi.rocketmq.service.RocketMqService; +import org.ssssssss.script.MagicScriptContext; + +/** + * @author zzy + */ +public class DefaultRocketMqService implements RocketMqService { + + + @Override + public boolean beforeProduce(String topic, String tag, Object msg) { + return true; + } + + @Override + public boolean afterProduce(String topic, String tag, Object msg) { + return true; + } + + @Override + public boolean failProduce(String topic, String tag, Object msg) { + return false; + } + + @Override + public boolean beforeConsume(MessageExt messageExt, MagicScriptContext magicScriptContext) { + return true; + } + + @Override + public boolean afterConsume(MessageExt messageExt, MagicScriptContext magicScriptContext) { + return true; + } + + @Override + public boolean failConsume(MessageExt messageExt, MagicScriptContext magicScriptContext) { + return false; + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/RocketMqInfoMagicResourceStorage.java b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/RocketMqInfoMagicResourceStorage.java new file mode 100644 index 00000000..eb14a75c --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/RocketMqInfoMagicResourceStorage.java @@ -0,0 +1,46 @@ +package org.ssssssss.magicapi.rocketmq.service; + + +import org.apache.commons.lang3.StringUtils; +import org.ssssssss.magicapi.core.model.MagicEntity; +import org.ssssssss.magicapi.core.service.AbstractPathMagicResourceStorage; +import org.ssssssss.magicapi.rocketmq.model.RocketMqInfo; + +import java.util.List; + +/** + * @author zzy + */ +public class RocketMqInfoMagicResourceStorage extends AbstractPathMagicResourceStorage { + + @Override + public String folder() { + return "rocketmq"; + } + + @Override + public Class magicClass() { + return RocketMqInfo.class; + } + + @Override + public void validate(RocketMqInfo entity) { + notBlank(entity.getTopic(), TOPIC_ID_REQUIRED); + String currentTag = StringUtils.isEmpty(entity.getTag()) ? "*" : entity.getTag(); + List files = magicResourceService.files(folder()); + boolean exists = files.stream().filter(x -> !x.getId().equals(entity.getId())).anyMatch(x -> { + String topic = ((RocketMqInfo) x).getTopic(); + String tag = ((RocketMqInfo) x).getTag(); + if (StringUtils.isEmpty(tag)) { + tag = "*"; + } + return topic.equals(entity.getTopic()) && tag.equals(currentTag); + }); + isTrue(!exists, TOPIC_TAG_REPEAT); + } + + @Override + public String buildMappingKey(RocketMqInfo info) { + return buildMappingKey(info, magicResourceService.getGroupPath(info.getGroupId())); + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/RocketMqMagicDynamicRegistry.java b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/RocketMqMagicDynamicRegistry.java new file mode 100644 index 00000000..53f6526e --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/RocketMqMagicDynamicRegistry.java @@ -0,0 +1,90 @@ +package org.ssssssss.magicapi.rocketmq.service; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.event.EventListener; +import org.ssssssss.magicapi.core.config.MagicConfiguration; +import org.ssssssss.magicapi.core.event.FileEvent; +import org.ssssssss.magicapi.core.event.GroupEvent; +import org.ssssssss.magicapi.core.service.AbstractMagicDynamicRegistry; +import org.ssssssss.magicapi.core.service.MagicResourceStorage; +import org.ssssssss.magicapi.rocketmq.consumer.RocketMQConsumer; +import org.ssssssss.magicapi.rocketmq.model.RocketMqInfo; + +/** + * @author zzy + */ +public class RocketMqMagicDynamicRegistry extends AbstractMagicDynamicRegistry { + private final RocketMQConsumer rocketMQConsumer; + private static final Logger logger = LoggerFactory.getLogger(RocketMqMagicDynamicRegistry.class); + + private final boolean showLog; + + + public RocketMqMagicDynamicRegistry(MagicResourceStorage magicResourceStorage, boolean showLog, RocketMqService rocketMqService, + String namesrvAddr) { + super(magicResourceStorage); + this.rocketMQConsumer = new RocketMQConsumer(namesrvAddr, rocketMqService); + this.showLog = showLog; + } + + @EventListener(condition = "#event.type == 'rocketmq'") + public void onFileEvent(FileEvent event) { + processEvent(event); + } + + @EventListener(condition = "#event.type == 'rocketmq'") + public void onGroupEvent(GroupEvent event) { + processEvent(event); + } + + @Override + public boolean register(RocketMqInfo entity) { + unregister(entity); + return super.register(entity); + } + + @Override + protected boolean register(MappingNode mappingNode) { + RocketMqInfo entity = mappingNode.getEntity(); + if (rocketMQConsumer != null) { + String scriptName = MagicConfiguration.getMagicResourceService().getScriptName(entity); + try { + if (entity.isEnabled()) { + try { + if (showLog) { + logger.info("消息队列:[{}]开始执行", scriptName); + } + rocketMQConsumer.subscribe(entity.getTopic(), entity.getTag(), scriptName, entity.getScript()); + } catch (Exception e) { + logger.error("消息队列执行出错", e); + } finally { + if (showLog) { + logger.info("消息队列:[{}]执行完毕", scriptName); + } + } + } + } catch (Exception e) { + logger.error("消息队列:[{}]注册失败", scriptName, e); + } + logger.debug("注册消息队列:[{},{}]", MagicConfiguration.getMagicResourceService().getScriptName(entity), entity.getTopic()); + } + + return true; + } + + @Override + protected void unregister(MappingNode mappingNode) { + RocketMqInfo info = mappingNode.getEntity(); + logger.debug("取消注册消息队列:[{}, {}, {}]", info.getName(), info.getPath(), info.getTopic()); + if (rocketMQConsumer != null) { + try { + rocketMQConsumer.unsubscribe(info.getTopic(), info.getTag()); + } catch (Exception e) { + String scriptName = MagicConfiguration.getMagicResourceService().getScriptName(info); + logger.warn("消息队列:[{}]取消失败", scriptName, e); + } + } + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/RocketMqService.java b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/RocketMqService.java new file mode 100644 index 00000000..f01e5f6c --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/service/RocketMqService.java @@ -0,0 +1,92 @@ +package org.ssssssss.magicapi.rocketmq.service; + +import org.apache.rocketmq.common.message.MessageExt; +import org.springframework.transaction.annotation.Transactional; +import org.ssssssss.magicapi.utils.ScriptManager; +import org.ssssssss.script.MagicScriptContext; + +/** + * @author zzy + */ +public interface RocketMqService { + + /** + * 消费默认实现 + * + * @param scriptName + * @param script + * @param msg + * @return + */ + @Transactional(rollbackFor = Exception.class) + default boolean consume(String scriptName, String script, MessageExt msg) { + MagicScriptContext magicScriptContext = new MagicScriptContext(); + magicScriptContext.setScriptName(scriptName); + magicScriptContext.set("msg", msg); + beforeConsume(msg, magicScriptContext); + Object result = ScriptManager.executeScript(script, magicScriptContext); + if (result != null) { + failConsume(msg, magicScriptContext); + return false; + } + afterConsume(msg, magicScriptContext); + return true; + } + + /** + * 发送消息前处理 + * + * @param topic 主题 + * @param tag 标签 + * @param msg 消息 + * @return + */ + boolean beforeProduce(String topic, String tag, Object msg); + + /** + * 发送消息后处理 + * + * @param topic 主题 + * @param tag 标签 + * @param msg 消息 + * @return + */ + boolean afterProduce(String topic, String tag, Object msg); + + /** + * 发送消息失败处理 + * + * @param topic 主题 + * @param tag 标签 + * @param msg 消息 + * @return + */ + boolean failProduce(String topic, String tag, Object msg); + + /** + * 消费消息前处理 + * + * @param messageExt 消息体 + * @param magicScriptContext magic 上下文 + * @return + */ + boolean beforeConsume(MessageExt messageExt, MagicScriptContext magicScriptContext); + + /** + * 消费消息后处理 + * + * @param messageExt 消息体 + * @param magicScriptContext magic 上下文 + * @return + */ + boolean afterConsume(MessageExt messageExt, MagicScriptContext magicScriptContext); + + /** + * 消费消息失败处理 + * + * @param messageExt 消息体 + * @param magicScriptContext magic 上下文 + * @return + */ + boolean failConsume(MessageExt messageExt, MagicScriptContext magicScriptContext); +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/starter/MagicAPIRocketMqConfiguration.java b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/starter/MagicAPIRocketMqConfiguration.java new file mode 100644 index 00000000..3657489b --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/starter/MagicAPIRocketMqConfiguration.java @@ -0,0 +1,71 @@ +package org.ssssssss.magicapi.rocketmq.starter; + + +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.ssssssss.magicapi.core.config.MagicPluginConfiguration; +import org.ssssssss.magicapi.core.model.Plugin; +import org.ssssssss.magicapi.core.web.MagicControllerRegister; +import org.ssssssss.magicapi.rocketmq.product.RocketMqModule; +import org.ssssssss.magicapi.rocketmq.service.DefaultRocketMqService; +import org.ssssssss.magicapi.rocketmq.service.RocketMqInfoMagicResourceStorage; +import org.ssssssss.magicapi.rocketmq.service.RocketMqMagicDynamicRegistry; +import org.ssssssss.magicapi.rocketmq.service.RocketMqService; +import org.ssssssss.magicapi.rocketmq.web.MagicRocketMqController; + +/** + * @author zzy + */ +@Configuration +@EnableConfigurationProperties(MagicRocketMqConfig.class) +public class MagicAPIRocketMqConfiguration implements MagicPluginConfiguration { + + private final MagicRocketMqConfig config; + + @Value("${rocketmq.name-server}") + private String nameServer; + + public MagicAPIRocketMqConfiguration(MagicRocketMqConfig config) { + this.config = config; + } + + @Bean + @ConditionalOnMissingBean + public RocketMqInfoMagicResourceStorage rocketMqInfoMagicResourceStorage() { + return new RocketMqInfoMagicResourceStorage(); + } + + @Bean + @ConditionalOnMissingBean + public RocketMqService rocketMqService() { + return new DefaultRocketMqService(); + } + + @Bean + @ConditionalOnMissingBean + public RocketMqMagicDynamicRegistry rocketMqMagicDynamicRegistry(RocketMqInfoMagicResourceStorage rocketMqInfoMagicResourceStorage, RocketMqService rocketMqService) { + return new RocketMqMagicDynamicRegistry(rocketMqInfoMagicResourceStorage, config.isLog(), rocketMqService, nameServer); + } + + @Override + public Plugin plugin() { + return new Plugin("rocket消息队列", "MagicRocketMq", "magic-rocketmq.1.0.0.iife.js"); + } + + @Override + public MagicControllerRegister controllerRegister() { + return (mapping, configuration) -> mapping.registerController(new MagicRocketMqController(configuration)); + } + + /** + * 注入rocketmq模块 + */ + @Bean + public RocketMqModule rocketMqFunctions(RocketMQTemplate rocketMQTemplate, RocketMqService rocketMqService) { + return new RocketMqModule(rocketMQTemplate, rocketMqService); + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/starter/MagicRocketMqConfig.java b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/starter/MagicRocketMqConfig.java new file mode 100644 index 00000000..50080a57 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/starter/MagicRocketMqConfig.java @@ -0,0 +1,26 @@ +package org.ssssssss.magicapi.rocketmq.starter; + + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author zzy + */ +@ConfigurationProperties("magic-api.rocketmq") +public class MagicRocketMqConfig { + /** + * 是否打印日志 + * + * @since 2.1.0 + */ + private boolean log = false; + + + public boolean isLog() { + return log; + } + + public void setLog(boolean log) { + this.log = log; + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/web/MagicRocketMqController.java b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/web/MagicRocketMqController.java new file mode 100644 index 00000000..2c25ca16 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/java/org/ssssssss/magicapi/rocketmq/web/MagicRocketMqController.java @@ -0,0 +1,46 @@ +package org.ssssssss.magicapi.rocketmq.web; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.ssssssss.magicapi.core.config.MagicConfiguration; +import org.ssssssss.magicapi.core.config.WebSocketSessionManager; +import org.ssssssss.magicapi.core.logging.MagicLoggerContext; +import org.ssssssss.magicapi.core.model.DebugRequest; +import org.ssssssss.magicapi.core.model.JsonBean; +import org.ssssssss.magicapi.core.model.MagicEntity; +import org.ssssssss.magicapi.core.servlet.MagicHttpServletRequest; +import org.ssssssss.magicapi.core.web.MagicController; +import org.ssssssss.magicapi.core.web.MagicExceptionHandler; +import org.ssssssss.magicapi.utils.ScriptManager; +import org.ssssssss.script.MagicScriptDebugContext; + + +/** + * @author zzy + */ +public class MagicRocketMqController extends MagicController implements MagicExceptionHandler { + + public MagicRocketMqController(MagicConfiguration configuration) { + super(configuration); + } + + @PostMapping("/rocketmq/execute") + @ResponseBody + public JsonBean execute(String id, MagicHttpServletRequest request){ + MagicEntity entity = MagicConfiguration.getMagicResourceService().file(id); + notNull(entity, FILE_NOT_FOUND); + String script = entity.getScript(); + DebugRequest debugRequest = DebugRequest.create(request); + MagicLoggerContext.SESSION.set(debugRequest.getRequestedClientId()); + String sessionAndScriptId = debugRequest.getRequestedClientId() + debugRequest.getRequestedScriptId(); + try { + MagicScriptDebugContext magicScriptContext = debugRequest.createMagicScriptContext(configuration.getDebugTimeout()); + WebSocketSessionManager.addMagicScriptContext(sessionAndScriptId, magicScriptContext); + magicScriptContext.setScriptName(MagicConfiguration.getMagicResourceService().getScriptName(entity)); + return new JsonBean<>(ScriptManager.executeScript(script, magicScriptContext)); + } finally { + WebSocketSessionManager.removeMagicScriptContext(sessionAndScriptId); + MagicLoggerContext.SESSION.remove(); + } + } +} diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/resources/META-INF/spring.factories b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..10be0e94 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.ssssssss.magicapi.rocketmq.starter.MagicAPIRocketMqConfiguration diff --git a/magic-api-plugins/magic-api-plugin-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..d039c6e5 --- /dev/null +++ b/magic-api-plugins/magic-api-plugin-rocketmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +MagicAPIRocketMqConfiguration diff --git a/magic-api-plugins/magic-api-plugin-task/src/main/java/org/ssssssss/magicapi/task/service/TaskMagicDynamicRegistry.java b/magic-api-plugins/magic-api-plugin-task/src/main/java/org/ssssssss/magicapi/task/service/TaskMagicDynamicRegistry.java index f8e93100..0dd56947 100644 --- a/magic-api-plugins/magic-api-plugin-task/src/main/java/org/ssssssss/magicapi/task/service/TaskMagicDynamicRegistry.java +++ b/magic-api-plugins/magic-api-plugin-task/src/main/java/org/ssssssss/magicapi/task/service/TaskMagicDynamicRegistry.java @@ -2,8 +2,10 @@ package org.ssssssss.magicapi.task.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; import org.springframework.context.event.EventListener; import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.concurrent.ExecutorConfigurationSupport; import org.springframework.scheduling.config.CronTask; import org.springframework.scheduling.support.CronTrigger; import org.ssssssss.magicapi.core.config.MagicConfiguration; @@ -16,8 +18,9 @@ import org.ssssssss.magicapi.utils.ScriptManager; import org.ssssssss.script.MagicScriptContext; import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ThreadPoolExecutor; -public class TaskMagicDynamicRegistry extends AbstractMagicDynamicRegistry { +public class TaskMagicDynamicRegistry extends AbstractMagicDynamicRegistry implements DisposableBean { private final TaskScheduler taskScheduler; @@ -99,4 +102,14 @@ public class TaskMagicDynamicRegistry extends AbstractMagicDynamicRegistrymagic-api-plugin-elasticsearch magic-api-plugin-cluster magic-api-plugin-git + magic-api-plugin-rocketmq diff --git a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java index 87a2478d..e84a2bb0 100644 --- a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java +++ b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java @@ -318,6 +318,10 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon })); } + @Bean + public WebSocketSessionManager magicWebSocketSessionManager(){ + return new WebSocketSessionManager(); + } @Bean public MagicConfiguration magicConfiguration(List languageProviders, org.ssssssss.magicapi.core.resource.Resource magicResource, diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/core/config/JsonCodeConstants.java b/magic-api/src/main/java/org/ssssssss/magicapi/core/config/JsonCodeConstants.java index 88082076..115138f8 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/core/config/JsonCodeConstants.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/core/config/JsonCodeConstants.java @@ -20,21 +20,21 @@ public interface JsonCodeConstants { JsonCode SECRET_KEY_IS_REQUIRED = new JsonCode(1004, "secretKey不能为空"); - JsonCode MOVE_NAME_CONFLICT = new JsonCode(1005, "移动后名称会重复,请修改名称后在试。"); + JsonCode MOVE_NAME_CONFLICT = new JsonCode(1005, "移动后名称会重复,请修改名称后再试。"); JsonCode SRC_GROUP_CONFLICT = new JsonCode(1006, "源对象和分组不能一致"); JsonCode FILE_NOT_FOUND = new JsonCode(1007, "找不到对应文件或分组"); - JsonCode RESOURCE_LOCKED = new JsonCode(1008, "当前资源已被锁定,请解锁后在操作。"); + JsonCode RESOURCE_LOCKED = new JsonCode(1008, "当前资源已被锁定,请解锁后再操作。"); - JsonCode PATH_CONFLICT = new JsonCode(1009, "该路径已被使用,请换一个路径在试"); + JsonCode PATH_CONFLICT = new JsonCode(1009, "该路径已被使用,请换一个路径再试"); JsonCode RESOURCE_PATH_CONFLICT = new JsonCode(1010, "资源中[%s]有冲突,请检查"); - JsonCode MOVE_PATH_CONFLICT = new JsonCode(1011, "移动后路径会冲突,请换一个路径在试"); + JsonCode MOVE_PATH_CONFLICT = new JsonCode(1011, "移动后路径会冲突,请换一个路径再试"); - JsonCode SAVE_GROUP_PATH_CONFLICT = new JsonCode(1036, "保存后路径会冲突,请换一个路径在试"); + JsonCode SAVE_GROUP_PATH_CONFLICT = new JsonCode(1036, "保存后路径会冲突,请换一个路径再试"); JsonCode REQUEST_METHOD_REQUIRED = new JsonCode(1012, "请求方法不能为空"); @@ -84,6 +84,10 @@ public interface JsonCodeConstants { JsonCode API_NOT_FOUND = new JsonCode(1035, "找不到接口"); + JsonCode TOPIC_ID_REQUIRED = new JsonCode(1036, "主题不能为空"); + + JsonCode TOPIC_TAG_REPEAT = new JsonCode(1037, "主题与标签重复"); + default void notNull(Object value, JsonCode jsonCode) { if (value == null) { throw new InvalidArgumentException(jsonCode); diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java b/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java index 1e6d5b58..5b008784 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java @@ -2,6 +2,9 @@ package org.ssssssss.magicapi.core.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; import org.springframework.web.socket.TextMessage; import org.ssssssss.magicapi.core.event.EventAction; import org.ssssssss.magicapi.core.context.MagicConsoleSession; @@ -17,7 +20,8 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -public class WebSocketSessionManager { +@Component +public class WebSocketSessionManager implements CommandLineRunner, DisposableBean { private static final Logger logger = LoggerFactory.getLogger(WebSocketSessionManager.class); @@ -43,13 +47,27 @@ public class WebSocketSessionManager { return SESSIONS.get(clientId); } - static { - // 1秒1次发送日志 - new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "magic-api-send-log-task")).scheduleAtFixedRate(WebSocketSessionManager::flushLog, 1, 1, TimeUnit.SECONDS); - // 60秒检测一次是否在线 - new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "magic-api-websocket-clean-task")).scheduleAtFixedRate(WebSocketSessionManager::checkSession, CHECK_INTERVAL, CHECK_INTERVAL, TimeUnit.SECONDS); + private ScheduledThreadPoolExecutor logExecutor; + private ScheduledThreadPoolExecutor wsExecutor; + @Override + public void destroy() { + if (logExecutor != null) { + logExecutor.shutdown(); + } + if (wsExecutor != null) { + wsExecutor.shutdown(); + } } + @Override + public void run(String... args) throws Exception { + // 1秒1次发送日志 + logExecutor = new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "magic-api-send-log-task")); + logExecutor.scheduleAtFixedRate(WebSocketSessionManager::flushLog, 1, 1, TimeUnit.SECONDS); + // 60秒检测一次是否在线 + wsExecutor = new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "magic-api-websocket-clean-task")); + wsExecutor.scheduleAtFixedRate(WebSocketSessionManager::checkSession, CHECK_INTERVAL, CHECK_INTERVAL, TimeUnit.SECONDS); + } public static Collection getSessions() { return SESSIONS.values(); }