From 0ec0df1c93678164314c8c7da8a2b205fac0ce2b Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Mon, 10 Mar 2025 15:45:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=20AI=EF=BC=8C=20?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E7=89=88=E6=9C=AC:=208.2.10=20=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E7=89=88=E6=9C=AC:=208.2.48?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- io.sc.platform.ai.frontend/.browserslistrc | 5 + io.sc.platform.ai.frontend/.editorconfig | 15 + io.sc.platform.ai.frontend/.eslintrc.cjs | 71 + io.sc.platform.ai.frontend/.gitignore | 32 + io.sc.platform.ai.frontend/.npmignore | 0 io.sc.platform.ai.frontend/.npmrc | 13 + io.sc.platform.ai.frontend/.prettierignore | 3 + io.sc.platform.ai.frontend/.prettierrc.json | 8 + io.sc.platform.ai.frontend/babel.config.cjs | 16 + .../frontend-register.json | 7 + io.sc.platform.ai.frontend/nodemon.json | 6 + io.sc.platform.ai.frontend/package.json | 126 + io.sc.platform.ai.frontend/postcss.config.cjs | 6 + .../public/configure.js | 43 + io.sc.platform.ai.frontend/public/favicon.svg | 5 + io.sc.platform.ai.frontend/public/index.html | 116 + .../public/login-bg.jpg | Bin 0 -> 240101 bytes io.sc.platform.ai.frontend/public/logo.svg | 5 + .../public/svg-editor/Editor.js | 52014 +++++++++++++++ .../public/svg-editor/Editor.js.map | 1 + .../svg-editor/browser-not-supported.html | 54 + .../svg-editor/browser-not-supported.js | 8 + .../components/jgraduate/images/AlphaBar.png | Bin 0 -> 1699 bytes .../components/jgraduate/images/Bars.png | Bin 0 -> 265 bytes .../components/jgraduate/images/Maps.png | Bin 0 -> 61784 bytes .../components/jgraduate/images/NoColor.png | Bin 0 -> 473 bytes .../jgraduate/images/bar-opacity.png | Bin 0 -> 80 bytes .../jgraduate/images/map-opacity.png | Bin 0 -> 81 bytes .../components/jgraduate/images/mappoint.gif | Bin 0 -> 93 bytes .../jgraduate/images/mappoint_c.png | Bin 0 -> 141 bytes .../jgraduate/images/mappoint_f.png | Bin 0 -> 144 bytes .../components/jgraduate/images/picker.gif | Bin 0 -> 146 bytes .../jgraduate/images/preview-opacity.png | Bin 0 -> 80 bytes .../jgraduate/images/rangearrows.gif | Bin 0 -> 76 bytes .../jgraduate/images/rangearrows2.gif | Bin 0 -> 93 bytes .../extensions/ext-connector/ext-connector.js | 712 + .../ext-connector/ext-connector.js.map | 1 + .../ext-eyedropper/ext-eyedropper.js | 253 + .../ext-eyedropper/ext-eyedropper.js.map | 1 + .../extensions/ext-grid/ext-grid.js | 278 + .../extensions/ext-grid/ext-grid.js.map | 1 + .../ext-helloworld/ext-helloworld.js | 176 + .../ext-helloworld/ext-helloworld.js.map | 1 + .../extensions/ext-markers/ext-markers.js | 373 + .../extensions/ext-markers/ext-markers.js.map | 1 + .../extensions/ext-opensave/ext-opensave.js | 644 + .../ext-opensave/ext-opensave.js.map | 1 + .../ext-overview_window.js | 233 + .../ext-overview_window.js.map | 1 + .../extensions/ext-panning/ext-panning.js | 159 + .../extensions/ext-panning/ext-panning.js.map | 1 + .../extensions/ext-polystar/ext-polystar.js | 629 + .../ext-polystar/ext-polystar.js.map | 1 + .../extensions/ext-shapes/ext-shapes.js | 340 + .../extensions/ext-shapes/ext-shapes.js.map | 1 + .../ext-shapes/shapelib/animal.json | 21 + .../extensions/ext-shapes/shapelib/arrow.json | 28 + .../extensions/ext-shapes/shapelib/basic.json | 32 + .../ext-shapes/shapelib/dialog_balloon.json | 9 + .../ext-shapes/shapelib/electronics.json | 20 + .../ext-shapes/shapelib/flowchart.json | 25 + .../extensions/ext-shapes/shapelib/game.json | 13 + .../extensions/ext-shapes/shapelib/index.json | 18 + .../shapelib/license-MIT-raphael.txt | 12 + .../extensions/ext-shapes/shapelib/math.json | 9 + .../extensions/ext-shapes/shapelib/misc.json | 37 + .../extensions/ext-shapes/shapelib/music.json | 21 + .../ext-shapes/shapelib/object.json | 18 + .../ext-shapes/shapelib/raphael_1.json | 65 + .../ext-shapes/shapelib/raphael_2.json | 64 + .../ext-shapes/shapelib/symbol.json | 28 + .../extensions/ext-storage/ext-storage.js | 394 + .../extensions/ext-storage/ext-storage.js.map | 1 + .../public/svg-editor/iife-Editor.js | 52019 ++++++++++++++++ .../public/svg-editor/iife-Editor.js.map | 1 + .../public/svg-editor/iife-index.html | 56 + .../public/svg-editor/images/add_subpath.svg | 16 + .../public/svg-editor/images/align.svg | 5 + .../public/svg-editor/images/align_bottom.svg | 1 + .../public/svg-editor/images/align_center.svg | 1 + .../svg-editor/images/align_distrib_horiz.svg | 1 + .../svg-editor/images/align_distrib_verti.svg | 1 + .../public/svg-editor/images/align_left.svg | 1 + .../public/svg-editor/images/align_middle.svg | 1 + .../public/svg-editor/images/align_right.svg | 1 + .../public/svg-editor/images/align_top.svg | 1 + .../public/svg-editor/images/anchor_end.svg | 8 + .../svg-editor/images/anchor_middle.svg | 8 + .../public/svg-editor/images/anchor_start.svg | 8 + .../public/svg-editor/images/angle.svg | 1 + .../public/svg-editor/images/arrow_down.svg | 3 + .../public/svg-editor/images/arrow_right.svg | 3 + .../svg-editor/images/arrow_right_big.svg | 3 + .../public/svg-editor/images/blur.svg | 1 + .../public/svg-editor/images/bold.svg | 8 + .../public/svg-editor/images/box.svg | 3 + .../public/svg-editor/images/box_o.svg | 3 + .../public/svg-editor/images/c_radius.svg | 5 + .../public/svg-editor/images/cancel.svg | 9 + .../public/svg-editor/images/circle.svg | 1 + .../public/svg-editor/images/clone.svg | 1 + .../public/svg-editor/images/close_path.svg | 14 + .../svg-editor/images/closepath_icons.svg | 41 + .../public/svg-editor/images/config.svg | 1 + .../public/svg-editor/images/conn.svg | 1 + .../public/svg-editor/images/context_menu.svg | 9 + .../public/svg-editor/images/delete.svg | 1 + .../public/svg-editor/images/docprop.svg | 1 + .../public/svg-editor/images/docprops.svg | 19 + .../public/svg-editor/images/editPref.svg | 1 + .../public/svg-editor/images/edit_foreign.svg | 57 + .../public/svg-editor/images/ellipse.svg | 1 + .../public/svg-editor/images/export.svg | 1 + .../public/svg-editor/images/eye.svg | 12 + .../public/svg-editor/images/eye_dropper.svg | 1 + .../public/svg-editor/images/fh_ellipse.svg | 1 + .../public/svg-editor/images/fh_rect.svg | 1 + .../public/svg-editor/images/fill.svg | 8 + .../public/svg-editor/images/fontsize.svg | 4 + .../public/svg-editor/images/forwardslash.svg | 3 + .../public/svg-editor/images/globe_link.svg | 1 + .../public/svg-editor/images/go_down.svg | 9 + .../public/svg-editor/images/go_up.svg | 9 + .../public/svg-editor/images/grid.svg | 1 + .../svg-editor/images/group_elements.svg | 1 + .../public/svg-editor/images/handle.svg | 1 + .../public/svg-editor/images/height.svg | 3 + .../public/svg-editor/images/hello_world.svg | 11 + .../public/svg-editor/images/image.svg | 1 + .../public/svg-editor/images/imagelib.svg | 10 + .../public/svg-editor/images/import.svg | 10 + .../public/svg-editor/images/importImg.svg | 1 + .../public/svg-editor/images/italic.svg | 8 + .../public/svg-editor/images/leftarrow.svg | 3 + .../public/svg-editor/images/leftarrow_o.svg | 3 + .../svg-editor/images/letter_spacing.svg | 17 + .../public/svg-editor/images/library.svg | 1 + .../public/svg-editor/images/linecap_butt.svg | 1 + .../svg-editor/images/linecap_round.svg | 1 + .../svg-editor/images/linecap_square.svg | 1 + .../svg-editor/images/linejoin_bevel.svg | 1 + .../svg-editor/images/linejoin_miter.svg | 1 + .../svg-editor/images/linejoin_round.svg | 1 + .../svg-editor/images/link_controls.svg | 7 + .../public/svg-editor/images/logo.svg | 25 + .../public/svg-editor/images/mcircle.svg | 3 + .../public/svg-editor/images/mcircle_o.svg | 3 + .../images/mkr_markers_dimension.svg | 7 + .../svg-editor/images/mkr_markers_label.svg | 5 + .../svg-editor/images/mkr_markers_off.svg | 3 + .../public/svg-editor/images/move_bottom.svg | 1 + .../public/svg-editor/images/move_top.svg | 1 + .../public/svg-editor/images/netlify-dark.svg | 17 + .../public/svg-editor/images/new.svg | 1 + .../public/svg-editor/images/no_color.svg | 4 + .../public/svg-editor/images/node_clone.svg | 8 + .../public/svg-editor/images/node_delete.svg | 10 + .../public/svg-editor/images/nomarker.svg | 3 + .../public/svg-editor/images/ok.svg | 9 + .../public/svg-editor/images/opacity.svg | 12 + .../public/svg-editor/images/open.svg | 1 + .../public/svg-editor/images/open_path.svg | 17 + .../public/svg-editor/images/openpath.png | Bin 0 -> 7955 bytes .../public/svg-editor/images/panning.svg | 1 + .../public/svg-editor/images/path.svg | 1 + .../public/svg-editor/images/pen.svg | 1 + .../public/svg-editor/images/pencil.svg | 1 + .../public/svg-editor/images/polygon.svg | 1 + .../public/svg-editor/images/rect.svg | 1 + .../public/svg-editor/images/redo.svg | 1 + .../public/svg-editor/images/reorient.svg | 1 + .../public/svg-editor/images/reverseslash.svg | 3 + .../public/svg-editor/images/rightarrow.svg | 3 + .../public/svg-editor/images/rightarrow_o.svg | 3 + .../public/svg-editor/images/rotate.svg | 4 + .../public/svg-editor/images/save.svg | 16 + .../public/svg-editor/images/saveImg.svg | 1 + .../public/svg-editor/images/select.svg | 1 + .../public/svg-editor/images/select_node.svg | 4 + .../public/svg-editor/images/shapelib.svg | 1 + .../public/svg-editor/images/source.svg | 1 + .../public/svg-editor/images/square.svg | 1 + .../public/svg-editor/images/star.svg | 1 + .../public/svg-editor/images/star_o.svg | 3 + .../public/svg-editor/images/stroke.svg | 3 + .../svg-editor/images/svg-edit-home.svg | 26 + .../public/svg-editor/images/text.svg | 1 + .../images/text_decoration_linethrough.svg | 6 + .../images/text_decoration_overline.svg | 6 + .../images/text_decoration_underline.svg | 6 + .../public/svg-editor/images/text_length.svg | 19 + .../public/svg-editor/images/textmarker.svg | 3 + .../svg-editor/images/textmarker_bottom.svg | 3 + .../svg-editor/images/textmarker_top.svg | 3 + .../public/svg-editor/images/to_path.svg | 1 + .../svg-editor/images/tool_add_subpath.svg | 1 + .../public/svg-editor/images/tool_foreign.svg | 30 + .../svg-editor/images/tool_imagelib.svg | 10 + .../svg-editor/images/tool_node_clone.svg | 1 + .../svg-editor/images/tool_node_delete.svg | 1 + .../svg-editor/images/tool_node_link.svg | 1 + .../svg-editor/images/tool_openclose_path.svg | 1 + .../svg-editor/images/tool_placemark.svg | 11 + .../public/svg-editor/images/triangle.svg | 3 + .../public/svg-editor/images/triangle_o.svg | 3 + .../public/svg-editor/images/undo.svg | 1 + .../public/svg-editor/images/ungroup.svg | 21 + .../public/svg-editor/images/unlink_use.svg | 14 + .../svg-editor/images/verticalslash.svg | 3 + .../public/svg-editor/images/warning.svg | 11 + .../public/svg-editor/images/webappfind.svg | 23 + .../public/svg-editor/images/width.svg | 3 + .../public/svg-editor/images/wireframe.svg | 1 + .../public/svg-editor/images/word_spacing.svg | 15 + .../public/svg-editor/images/xmark.svg | 3 + .../public/svg-editor/images/zoom.svg | 1 + .../public/svg-editor/index.html | 56 + .../public/svg-editor/svgedit.css | 615 + .../public/svg-editor/xdomain-Editor.js | 52016 +++++++++++++++ .../public/svg-editor/xdomain-Editor.js.map | 1 + .../public/svg-editor/xdomain-index.html | 56 + .../svg-path-editor/3rdpartylicenses.txt | 297 + .../KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ copy.woff2 | Bin 0 -> 13432 bytes .../KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2 | Bin 0 -> 13432 bytes .../KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2 | Bin 0 -> 13528 bytes .../KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2 | Bin 0 -> 10436 bytes .../assets/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2 | Bin 0 -> 13388 bytes .../assets/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2 | Bin 0 -> 10396 bytes .../public/svg-path-editor/assets/css.css | 213 + .../public/svg-path-editor/assets/delete.svg | 1 + .../public/svg-path-editor/assets/github.svg | 1 + .../assets/icons/icon-128x128.png | Bin 0 -> 15747 bytes .../assets/icons/icon-144x144.png | Bin 0 -> 18578 bytes .../assets/icons/icon-152x152-cropped.png | Bin 0 -> 21635 bytes .../assets/icons/icon-152x152.png | Bin 0 -> 19601 bytes .../assets/icons/icon-192x192.png | Bin 0 -> 24535 bytes .../assets/icons/icon-384x384.png | Bin 0 -> 47170 bytes .../assets/icons/icon-512x512.png | Bin 0 -> 44297 bytes .../assets/icons/icon-72x72.png | Bin 0 -> 7038 bytes .../assets/icons/icon-96x96.png | Bin 0 -> 10831 bytes .../public/svg-path-editor/assets/logo.svg | 1 + .../assets/materialicons-v142.woff2 | Bin 0 -> 128616 bytes .../public/svg-path-editor/assets/more.svg | 1 + .../public/svg-path-editor/assets/sponsor.svg | 1 + .../svg-path-editor/assets/zoom_fit.svg | 1 + .../public/svg-path-editor/assets/zoom_in.svg | 1 + .../svg-path-editor/assets/zoom_out.svg | 1 + .../public/svg-path-editor/favicon.ico | Bin 0 -> 16958 bytes .../public/svg-path-editor/index.html | 23 + .../svg-path-editor/main.19cfcacc3c0bb7eb.js | 1 + .../svg-path-editor/manifest.webmanifest | 59 + .../public/svg-path-editor/ngsw-worker.js | 1863 + .../public/svg-path-editor/ngsw.json | 115 + .../polyfills.179c8bf8046b88bb.js | 1 + .../runtime.6f6474d711a7c88e.js | 1 + .../public/svg-path-editor/safety-worker.js | 30 + .../styles.a4c2c16033803e20.css | 1 + .../svg-path-editor/worker-basic.min.js | 30 + .../public/tailwind.css.js | 62 + .../2.1.13/assets/iconfont/Anton-Regular.ttf | Bin 0 -> 79396 bytes .../assets/iconfont/HanaleiFill-Regular.ttf | Bin 0 -> 92108 bytes .../assets/iconfont/Pacifico-Regular.ttf | Bin 0 -> 229996 bytes .../2.1.13/assets/iconfont/demo.css | 539 + .../2.1.13/assets/iconfont/demo_index.html | 2700 + .../2.1.13/assets/iconfont/iconfont.css | 457 + .../2.1.13/assets/iconfont/iconfont.eot | Bin 0 -> 21840 bytes .../2.1.13/assets/iconfont/iconfont.js | 1 + .../2.1.13/assets/iconfont/iconfont.json | 779 + .../2.1.13/assets/iconfont/iconfont.svg | 356 + .../2.1.13/assets/iconfont/iconfont.ttf | Bin 0 -> 21672 bytes .../2.1.13/assets/iconfont/iconfont.woff | Bin 0 -> 10792 bytes .../2.1.13/assets/iconfont/iconfont.woff2 | Bin 0 -> 8784 bytes .../webjars/luckysheet/2.1.13/css/EwaAntH.gif | Bin 0 -> 1268 bytes .../webjars/luckysheet/2.1.13/css/EwaAntV.gif | Bin 0 -> 1266 bytes .../luckysheet/2.1.13/css/arrow-down.png | Bin 0 -> 85 bytes .../webjars/luckysheet/2.1.13/css/loading.gif | Bin 0 -> 69010 bytes .../luckysheet/2.1.13/css/luckysheet.css | 1 + .../luckysheet/2.1.13/css/menuSprite.svg | 505 + .../luckysheet/2.1.13/css/paint_16px.ico | Bin 0 -> 1022 bytes .../luckysheet/2.1.13/css/paint_24px.ico | Bin 0 -> 2174 bytes .../luckysheet/2.1.13/css/paint_32px.ico | Bin 0 -> 3774 bytes .../luckysheet/2.1.13/css/sprite38.svg | 528 + .../luckysheet/2.1.13/css/waffle_sprite.png | Bin 0 -> 8116 bytes .../luckysheet/2.1.13/demoData/demoFeature.js | 42 + .../luckysheet/2.1.13/demoData/sheetCell.js | 1578 + .../luckysheet/2.1.13/demoData/sheetChart.js | 4918 ++ .../2.1.13/demoData/sheetComment.js | 67 + .../2.1.13/demoData/sheetConditionFormat.js | 6541 ++ .../2.1.13/demoData/sheetDataVerification.js | 579 + .../2.1.13/demoData/sheetFormula.js | 6600 ++ .../2.1.13/demoData/sheetPicture.js | 159 + .../2.1.13/demoData/sheetPivotTable.js | 189 + .../2.1.13/demoData/sheetPivotTableData.js | 741 + .../2.1.13/demoData/sheetSparkline.js | 7066 +++ .../luckysheet/2.1.13/demoData/sheetTable.js | 1068 + .../2.1.13/expendPlugins/chart/chartmix.css | 1 + .../expendPlugins/chart/chartmix.umd.min.js | 26 + .../luckysheet/2.1.13/fonts/FontAwesome.otf | Bin 0 -> 134808 bytes .../2.1.13/fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../2.1.13/fonts/fontawesome-webfont.svg | 2671 + .../2.1.13/fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../2.1.13/fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../2.1.13/fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes .../webjars/luckysheet/2.1.13/index.html | 1944 + .../luckysheet/2.1.13/luckysheet.umd.js | 4152 ++ .../luckysheet/2.1.13/luckysheet.umd.js.map | 7 + .../2.1.13/plugins/css/pluginsCss.css | 1 + .../plugins/images/CFcolorGradation.png | Bin 0 -> 2383 bytes .../2.1.13/plugins/images/CFdataBar.png | Bin 0 -> 3464 bytes .../2.1.13/plugins/images/CFicons.png | Bin 0 -> 31534 bytes .../2.1.13/plugins/images/icon_dropCell.png | Bin 0 -> 230 bytes .../luckysheet/2.1.13/plugins/images/js.png | Bin 0 -> 314 bytes .../images/ui-icons_444444_256x240.png | Bin 0 -> 6992 bytes .../images/ui-icons_555555_256x240.png | Bin 0 -> 6988 bytes .../images/ui-icons_777620_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_777777_256x240.png | Bin 0 -> 6999 bytes .../images/ui-icons_cc0000_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 6299 bytes .../luckysheet/2.1.13/plugins/js/plugin.js | 1 + .../luckysheet/2.1.13/plugins/plugins.css | 10 + .../tailwindcss/3.4.16/tailwind.css.js | 83 + io.sc.platform.ai.frontend/src/App.vue | 5 + io.sc.platform.ai.frontend/src/boostrap.ts | 52 + .../src/components/index.ts | 11 + io.sc.platform.ai.frontend/src/i18n/index.ts | 18 + .../src/i18n/messages.json | 13 + .../src/i18n/messages_tw_CN.json | 13 + .../src/i18n/messages_zh_CN.json | 13 + io.sc.platform.ai.frontend/src/main.ts | 1 + .../src/menus/menus.json | 19 + io.sc.platform.ai.frontend/src/mock/index.ts | 20 + .../src/routes/routes.json | 17 + io.sc.platform.ai.frontend/src/shims-vue.d.ts | 33 + .../src/views/chat/Chat.vue | 186 + .../tailwind.config.cjs | 15 + io.sc.platform.ai.frontend/tsconfig.json | 22 + .../util-components-generator.cjs | 50 + .../util-frontend-register.cjs | 173 + .../webpack.config.common.cjs | 183 + .../webpack.config.mf.cjs | 81 + .../webpack.env.build.cjs | 97 + .../webpack.env.prod.cjs | 36 + .../webpack.env.serve.cjs | 35 + io.sc.platform.core.frontend/src/icons/svg.ts | 1 + .../src/views/testcase/ai/Ai.vue | 186 + .../template-project/src/icons/svg.ts | 1 + .../src/views/testcase/ai/Ai.vue | 186 + 347 files changed, 211266 insertions(+) create mode 100644 io.sc.platform.ai.frontend/.browserslistrc create mode 100644 io.sc.platform.ai.frontend/.editorconfig create mode 100644 io.sc.platform.ai.frontend/.eslintrc.cjs create mode 100644 io.sc.platform.ai.frontend/.gitignore create mode 100644 io.sc.platform.ai.frontend/.npmignore create mode 100644 io.sc.platform.ai.frontend/.npmrc create mode 100644 io.sc.platform.ai.frontend/.prettierignore create mode 100644 io.sc.platform.ai.frontend/.prettierrc.json create mode 100644 io.sc.platform.ai.frontend/babel.config.cjs create mode 100644 io.sc.platform.ai.frontend/frontend-register.json create mode 100644 io.sc.platform.ai.frontend/nodemon.json create mode 100644 io.sc.platform.ai.frontend/package.json create mode 100644 io.sc.platform.ai.frontend/postcss.config.cjs create mode 100644 io.sc.platform.ai.frontend/public/configure.js create mode 100644 io.sc.platform.ai.frontend/public/favicon.svg create mode 100644 io.sc.platform.ai.frontend/public/index.html create mode 100644 io.sc.platform.ai.frontend/public/login-bg.jpg create mode 100644 io.sc.platform.ai.frontend/public/logo.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/Editor.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/Editor.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/browser-not-supported.html create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/browser-not-supported.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/AlphaBar.png create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/Bars.png create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/Maps.png create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/NoColor.png create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/bar-opacity.png create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/map-opacity.png create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/mappoint.gif create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/mappoint_c.png create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/mappoint_f.png create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/picker.gif create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/preview-opacity.png create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/rangearrows.gif create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/components/jgraduate/images/rangearrows2.gif create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-connector/ext-connector.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-connector/ext-connector.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-eyedropper/ext-eyedropper.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-eyedropper/ext-eyedropper.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-grid/ext-grid.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-grid/ext-grid.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-helloworld/ext-helloworld.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-helloworld/ext-helloworld.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-markers/ext-markers.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-markers/ext-markers.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-opensave/ext-opensave.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-opensave/ext-opensave.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-overview_window/ext-overview_window.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-overview_window/ext-overview_window.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-panning/ext-panning.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-panning/ext-panning.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-polystar/ext-polystar.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-polystar/ext-polystar.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/ext-shapes.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/ext-shapes.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/animal.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/arrow.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/basic.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/dialog_balloon.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/electronics.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/flowchart.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/game.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/index.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/license-MIT-raphael.txt create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/math.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/misc.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/music.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/object.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/raphael_1.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/raphael_2.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-shapes/shapelib/symbol.json create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-storage/ext-storage.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/extensions/ext-storage/ext-storage.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/iife-Editor.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/iife-Editor.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/iife-index.html create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/add_subpath.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/align.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/align_bottom.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/align_center.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/align_distrib_horiz.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/align_distrib_verti.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/align_left.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/align_middle.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/align_right.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/align_top.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/anchor_end.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/anchor_middle.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/anchor_start.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/angle.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/arrow_down.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/arrow_right.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/arrow_right_big.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/blur.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/bold.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/box.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/box_o.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/c_radius.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/cancel.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/circle.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/clone.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/close_path.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/closepath_icons.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/config.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/conn.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/context_menu.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/delete.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/docprop.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/docprops.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/editPref.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/edit_foreign.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/ellipse.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/export.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/eye.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/eye_dropper.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/fh_ellipse.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/fh_rect.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/fill.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/fontsize.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/forwardslash.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/globe_link.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/go_down.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/go_up.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/grid.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/group_elements.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/handle.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/height.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/hello_world.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/image.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/imagelib.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/import.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/importImg.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/italic.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/leftarrow.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/leftarrow_o.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/letter_spacing.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/library.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/linecap_butt.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/linecap_round.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/linecap_square.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/linejoin_bevel.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/linejoin_miter.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/linejoin_round.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/link_controls.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/logo.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/mcircle.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/mcircle_o.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/mkr_markers_dimension.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/mkr_markers_label.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/mkr_markers_off.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/move_bottom.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/move_top.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/netlify-dark.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/new.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/no_color.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/node_clone.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/node_delete.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/nomarker.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/ok.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/opacity.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/open.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/open_path.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/openpath.png create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/panning.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/path.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/pen.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/pencil.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/polygon.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/rect.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/redo.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/reorient.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/reverseslash.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/rightarrow.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/rightarrow_o.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/rotate.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/save.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/saveImg.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/select.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/select_node.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/shapelib.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/source.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/square.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/star.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/star_o.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/stroke.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/svg-edit-home.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/text.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/text_decoration_linethrough.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/text_decoration_overline.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/text_decoration_underline.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/text_length.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/textmarker.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/textmarker_bottom.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/textmarker_top.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/to_path.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/tool_add_subpath.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/tool_foreign.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/tool_imagelib.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/tool_node_clone.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/tool_node_delete.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/tool_node_link.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/tool_openclose_path.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/tool_placemark.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/triangle.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/triangle_o.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/undo.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/ungroup.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/unlink_use.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/verticalslash.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/warning.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/webappfind.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/width.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/wireframe.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/word_spacing.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/xmark.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/images/zoom.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/index.html create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/svgedit.css create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/xdomain-Editor.js create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/xdomain-Editor.js.map create mode 100644 io.sc.platform.ai.frontend/public/svg-editor/xdomain-index.html create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/3rdpartylicenses.txt create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ copy.woff2 create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2 create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2 create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2 create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2 create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2 create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/css.css create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/delete.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/github.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/icons/icon-128x128.png create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/icons/icon-144x144.png create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/icons/icon-152x152-cropped.png create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/icons/icon-152x152.png create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/icons/icon-192x192.png create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/icons/icon-384x384.png create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/icons/icon-512x512.png create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/icons/icon-72x72.png create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/icons/icon-96x96.png create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/logo.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/materialicons-v142.woff2 create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/more.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/sponsor.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/zoom_fit.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/zoom_in.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/assets/zoom_out.svg create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/favicon.ico create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/index.html create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/main.19cfcacc3c0bb7eb.js create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/manifest.webmanifest create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/ngsw-worker.js create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/ngsw.json create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/polyfills.179c8bf8046b88bb.js create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/runtime.6f6474d711a7c88e.js create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/safety-worker.js create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/styles.a4c2c16033803e20.css create mode 100644 io.sc.platform.ai.frontend/public/svg-path-editor/worker-basic.min.js create mode 100644 io.sc.platform.ai.frontend/public/tailwind.css.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/Anton-Regular.ttf create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/HanaleiFill-Regular.ttf create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/Pacifico-Regular.ttf create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/demo.css create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/demo_index.html create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.css create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.eot create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.json create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.svg create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.ttf create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.woff create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/assets/iconfont/iconfont.woff2 create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/css/EwaAntH.gif create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/css/EwaAntV.gif create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/css/arrow-down.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/css/loading.gif create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/css/luckysheet.css create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/css/menuSprite.svg create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/css/paint_16px.ico create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/css/paint_24px.ico create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/css/paint_32px.ico create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/css/sprite38.svg create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/css/waffle_sprite.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/demoFeature.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/sheetCell.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/sheetChart.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/sheetComment.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/sheetConditionFormat.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/sheetDataVerification.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/sheetFormula.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/sheetPicture.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/sheetPivotTable.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/sheetPivotTableData.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/sheetSparkline.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/demoData/sheetTable.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/expendPlugins/chart/chartmix.css create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/expendPlugins/chart/chartmix.umd.min.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/fonts/FontAwesome.otf create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.eot create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.svg create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.ttf create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.woff create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/fonts/fontawesome-webfont.woff2 create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/index.html create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/luckysheet.umd.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/luckysheet.umd.js.map create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/css/pluginsCss.css create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/images/CFcolorGradation.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/images/CFdataBar.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/images/CFicons.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/images/icon_dropCell.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/images/js.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/images/ui-icons_444444_256x240.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/images/ui-icons_555555_256x240.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/images/ui-icons_777620_256x240.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/images/ui-icons_777777_256x240.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/images/ui-icons_cc0000_256x240.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/images/ui-icons_ffffff_256x240.png create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/js/plugin.js create mode 100644 io.sc.platform.ai.frontend/public/webjars/luckysheet/2.1.13/plugins/plugins.css create mode 100644 io.sc.platform.ai.frontend/public/webjars/tailwindcss/3.4.16/tailwind.css.js create mode 100644 io.sc.platform.ai.frontend/src/App.vue create mode 100644 io.sc.platform.ai.frontend/src/boostrap.ts create mode 100644 io.sc.platform.ai.frontend/src/components/index.ts create mode 100644 io.sc.platform.ai.frontend/src/i18n/index.ts create mode 100644 io.sc.platform.ai.frontend/src/i18n/messages.json create mode 100644 io.sc.platform.ai.frontend/src/i18n/messages_tw_CN.json create mode 100644 io.sc.platform.ai.frontend/src/i18n/messages_zh_CN.json create mode 100644 io.sc.platform.ai.frontend/src/main.ts create mode 100644 io.sc.platform.ai.frontend/src/menus/menus.json create mode 100644 io.sc.platform.ai.frontend/src/mock/index.ts create mode 100644 io.sc.platform.ai.frontend/src/routes/routes.json create mode 100644 io.sc.platform.ai.frontend/src/shims-vue.d.ts create mode 100644 io.sc.platform.ai.frontend/src/views/chat/Chat.vue create mode 100644 io.sc.platform.ai.frontend/tailwind.config.cjs create mode 100644 io.sc.platform.ai.frontend/tsconfig.json create mode 100644 io.sc.platform.ai.frontend/util-components-generator.cjs create mode 100644 io.sc.platform.ai.frontend/util-frontend-register.cjs create mode 100644 io.sc.platform.ai.frontend/webpack.config.common.cjs create mode 100644 io.sc.platform.ai.frontend/webpack.config.mf.cjs create mode 100644 io.sc.platform.ai.frontend/webpack.env.build.cjs create mode 100644 io.sc.platform.ai.frontend/webpack.env.prod.cjs create mode 100644 io.sc.platform.ai.frontend/webpack.env.serve.cjs create mode 100644 io.sc.platform.core.frontend/src/icons/svg.ts create mode 100644 io.sc.platform.core.frontend/src/views/testcase/ai/Ai.vue create mode 100644 io.sc.platform.core.frontend/template-project/src/icons/svg.ts create mode 100644 io.sc.platform.core.frontend/template-project/src/views/testcase/ai/Ai.vue diff --git a/io.sc.platform.ai.frontend/.browserslistrc b/io.sc.platform.ai.frontend/.browserslistrc new file mode 100644 index 00000000..1fff95c5 --- /dev/null +++ b/io.sc.platform.ai.frontend/.browserslistrc @@ -0,0 +1,5 @@ +chrome >=89 +edge >=88 +firefox >=89 +safari >=15 +ios_saf >=15 \ No newline at end of file diff --git a/io.sc.platform.ai.frontend/.editorconfig b/io.sc.platform.ai.frontend/.editorconfig new file mode 100644 index 00000000..4bd609e2 --- /dev/null +++ b/io.sc.platform.ai.frontend/.editorconfig @@ -0,0 +1,15 @@ +################################################################# +# 强制对使用该基本代码的所有人实施一致的编码样式 +################################################################# + +# 顶级配置(即不集成父配置) +root = true + +# 针对所有文件 +[*] +charset = utf-8 # 字符集: utf-8 +indent_size = 2 # 缩进大小: 2 +indent_style = space # 缩进风格: 空格 +end_of_line = lf # 行结束符: 换行符 +insert_final_newline = true # 是否在文件的最后插入一个空行 +trim_trailing_whitespace = true # 是否删除行尾的空格 diff --git a/io.sc.platform.ai.frontend/.eslintrc.cjs b/io.sc.platform.ai.frontend/.eslintrc.cjs new file mode 100644 index 00000000..3c6261c6 --- /dev/null +++ b/io.sc.platform.ai.frontend/.eslintrc.cjs @@ -0,0 +1,71 @@ +module.exports = { + // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy + // This option interrupts the configuration hierarchy at this file + // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) + root: true, + + env: { + browser: true, + es2022: true, + node: true, + 'vue/setup-compiler-macros': true, + }, + + // Rules order is important, please avoid shuffling them + extends: [ + // Base ESLint recommended rules + 'eslint:recommended', + + // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage + // ESLint typescript rules + 'plugin:@typescript-eslint/recommended', + + // Vue ESLint recommended rules + // 'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention) + // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability) + // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead) + 'plugin:vue/vue3-recommended', + + // https://github.com/prettier/eslint-config-prettier#installation + // usage with Prettier, provided by 'eslint-config-prettier'. + 'plugin:prettier/recommended', // Recommended + ], + + parser: 'vue-eslint-parser', + parserOptions: { + ecmaVersion: 2022, + parser: '@typescript-eslint/parser', + ecmaFeatures: { + jsx: false, + }, + }, + + plugins: [ + // required to apply rules which need type information + '@typescript-eslint', + + // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files + // required to lint *.vue files + 'vue', + + // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674 + // Prettier has not been included as plugin to avoid performance impact + // add it as an extension for your IDE + ], + + rules: { + semi: [1], + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-expressions': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-this-alias': 'off', + 'vue/multi-word-component-names': 'off' /* 禁用 vue 组件名称检查规则 */, + 'no-prototype-builtins': 'off', + 'prefer-rest-params': 'off', + 'no-control-regex': 'off', + 'no-case-declarations': 'off', + 'vue/no-v-html': 'off' + }, +}; diff --git a/io.sc.platform.ai.frontend/.gitignore b/io.sc.platform.ai.frontend/.gitignore new file mode 100644 index 00000000..f5dbd6f5 --- /dev/null +++ b/io.sc.platform.ai.frontend/.gitignore @@ -0,0 +1,32 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +.vuepress + +test-results/ +playwright-report/ diff --git a/io.sc.platform.ai.frontend/.npmignore b/io.sc.platform.ai.frontend/.npmignore new file mode 100644 index 00000000..e69de29b diff --git a/io.sc.platform.ai.frontend/.npmrc b/io.sc.platform.ai.frontend/.npmrc new file mode 100644 index 00000000..ac3953c7 --- /dev/null +++ b/io.sc.platform.ai.frontend/.npmrc @@ -0,0 +1,13 @@ +# npm 仓库地址, 在 npm install 时使用 +registry=http://nexus.sc.io:8000/repository/npm-public/ + +# 用户邮箱 +email= +# publish 时无需先进行 git 代码同步检查, 可避免 publish 时使用 --no-git-checks 选项 +git-checks=false + +# 注意: 以下 // 不是注释,不能去掉哦 +# 登录 npm 仓库的用户认证信息, 在 npm publish 时使用, publish 的 npm registry 在 package.json 文件中 publishConfig 部分配置 +# _authToken 可通过以下命令获取 +# curl -X PUT -H "Content-Type:application/json" -d '{"_id":"org.couchdb.user:admin","name":"admin","password":"admin"}' http://nexus.sc.io:8000/repository/npm-releases/-/user/org.couchdb.user:admin +//nexus.sc.io:8000/repository/npm-releases/:_authToken=NpmToken.67c99588-56a6-3ce1-9bea-a9a6164f8090 diff --git a/io.sc.platform.ai.frontend/.prettierignore b/io.sc.platform.ai.frontend/.prettierignore new file mode 100644 index 00000000..b5c08636 --- /dev/null +++ b/io.sc.platform.ai.frontend/.prettierignore @@ -0,0 +1,3 @@ +build +dist +node_modules \ No newline at end of file diff --git a/io.sc.platform.ai.frontend/.prettierrc.json b/io.sc.platform.ai.frontend/.prettierrc.json new file mode 100644 index 00000000..f9e9ce41 --- /dev/null +++ b/io.sc.platform.ai.frontend/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": true, + "tabWidth": 2, + "singleQuote": true, + "printWidth": 160, + "trailingComma": "all" +} \ No newline at end of file diff --git a/io.sc.platform.ai.frontend/babel.config.cjs b/io.sc.platform.ai.frontend/babel.config.cjs new file mode 100644 index 00000000..0ff56db5 --- /dev/null +++ b/io.sc.platform.ai.frontend/babel.config.cjs @@ -0,0 +1,16 @@ +module.exports = { + presets: [ + "@babel/preset-env", + [ + "@babel/preset-typescript", + { + allExtensions: true, //支持所有文件扩展名 + }, + ], + ], + plugins: [ + "@babel/plugin-transform-class-properties", + "@babel/plugin-transform-object-rest-spread", + "@vue/babel-plugin-jsx", + ] +} diff --git a/io.sc.platform.ai.frontend/frontend-register.json b/io.sc.platform.ai.frontend/frontend-register.json new file mode 100644 index 00000000..2fdc3765 --- /dev/null +++ b/io.sc.platform.ai.frontend/frontend-register.json @@ -0,0 +1,7 @@ +{ + "enable": false, + "protocol": "http", + "host": "localhost", + "port": 8080, + "path": "/api/mvc/frontend/regist" +} \ No newline at end of file diff --git a/io.sc.platform.ai.frontend/nodemon.json b/io.sc.platform.ai.frontend/nodemon.json new file mode 100644 index 00000000..99590b18 --- /dev/null +++ b/io.sc.platform.ai.frontend/nodemon.json @@ -0,0 +1,6 @@ +{ + "watch": [ + "./src/routes/routes.json" + ], + "exec": "pnpm serve" +} \ No newline at end of file diff --git a/io.sc.platform.ai.frontend/package.json b/io.sc.platform.ai.frontend/package.json new file mode 100644 index 00000000..a913e00b --- /dev/null +++ b/io.sc.platform.ai.frontend/package.json @@ -0,0 +1,126 @@ +{ + "name": "io.sc.platform.ai.frontend", + "version": "8.2.10", + "description": "", + "private": false, + "keywords": [], + "author": "", + "license": "ISC", + "scripts": { + "dev": "nodemon", + "serve": "node ./util-components-generator.cjs && cross-env NODE_ENV=development webpack serve --config webpack.env.serve.cjs", + "build": "node ./util-components-generator.cjs && cross-env NODE_ENV=development webpack --config webpack.env.build.cjs", + "prod": "node ./util-components-generator.cjs && cross-env NODE_ENV=production webpack --config webpack.env.prod.cjs", + "clean": "platform clean dist ./node_modules ./pnpm-lock.yaml ./package-lock.json", + "sync": "platform sync" + }, + "engines": { + "node": ">=18", + "pnpm": ">=7" + }, + "publishConfig": { + "registry": "http://nexus.sc.io:8000/repository/npm-releases/", + "access": "public" + }, + "devDependencies": { + "@babel/core": "7.26.0", + "@babel/plugin-transform-class-properties": "7.25.9", + "@babel/plugin-transform-object-rest-spread": "7.25.9", + "@babel/preset-env": "7.26.0", + "@babel/preset-typescript": "7.26.0", + "@quasar/app-webpack": "4.0.7", + "@quasar/cli": "2.4.1", + "@types/mockjs": "1.0.10", + "@types/node": "22.10.7", + "@typescript-eslint/eslint-plugin": "8.20.0", + "@typescript-eslint/parser": "8.20.0", + "@vue/babel-plugin-jsx": "1.2.5", + "@vue/compiler-sfc": "3.5.13", + "@vuepress/bundler-webpack": "2.0.0-rc.15", + "@vuepress/theme-default": "2.0.0-rc.49", + "@webpack-cli/serve": "3.0.1", + "autoprefixer": "10.4.20", + "babel-loader": "9.2.1", + "clean-webpack-plugin": "4.0.0", + "compression-webpack-plugin": "11.1.0", + "copy-webpack-plugin": "12.0.2", + "cross-env": "7.0.3", + "css-loader": "7.1.2", + "eslint": "9.18.0", + "eslint-config-prettier": "10.0.1", + "eslint-plugin-prettier": "5.2.2", + "eslint-plugin-vue": "9.32.0", + "eslint-webpack-plugin": "4.2.0", + "html-webpack-plugin": "5.6.3", + "json5": "2.2.3", + "mini-css-extract-plugin": "2.9.2", + "nodemon": "3.1.9", + "postcss": "8.5.1", + "postcss-import": "16.1.0", + "postcss-loader": "8.1.1", + "postcss-preset-env": "10.1.3", + "prettier": "3.4.2", + "sass": "1.83.4", + "sass-loader": "16.0.4", + "tailwindcss": "3.4.17", + "typescript": "5.5.4", + "vue-loader": "17.4.2", + "vuepress": "2.0.0-rc.15", + "webpack": "5.97.1", + "webpack-bundle-analyzer": "4.10.2", + "webpack-cli": "6.0.1", + "webpack-dev-server": "5.2.0", + "webpack-merge": "6.0.1" + }, + "dependencies": { + "@codemirror/autocomplete": "6.18.4", + "@codemirror/commands": "6.8.0", + "@codemirror/lang-html": "6.4.9", + "@codemirror/lang-java": "6.0.1", + "@codemirror/lang-javascript": "6.2.2", + "@codemirror/lang-json": "6.0.1", + "@codemirror/lang-sql": "6.8.0", + "@codemirror/lang-xml": "6.1.0", + "@codemirror/language": "6.10.8", + "@codemirror/search": "6.5.8", + "@codemirror/state": "6.5.1", + "@codemirror/view": "6.36.2", + "@maxgraph/core": "0.14.0", + "@quasar/extras": "1.16.15", + "@quasar/quasar-ui-qmarkdown": "2.0.5", + "@univerjs/core": "0.5.4", + "@univerjs/design": "0.5.4", + "@univerjs/docs": "0.5.4", + "@univerjs/docs-ui": "0.5.4", + "@univerjs/engine-formula": "0.5.4", + "@univerjs/engine-render": "0.5.4", + "@univerjs/facade": "0.5.4", + "@univerjs/sheets": "0.5.4", + "@univerjs/sheets-formula": "0.5.4", + "@univerjs/sheets-ui": "0.5.4", + "@univerjs/thread-comment": "0.5.4", + "@univerjs/ui": "0.5.4", + "@vueuse/core": "12.4.0", + "axios": "1.8.2", + "codemirror": "6.0.1", + "dayjs": "1.11.13", + "echarts": "5.6.0", + "exceljs": "4.4.0", + "file-saver": "2.0.5", + "luckyexcel": "1.0.1", + "mockjs": "1.1.0", + "node-sql-parser": "5.3.6", + "pinia": "2.3.0", + "pinia-undo": "0.2.4", + "platform-core": "8.2.48", + "quasar": "2.17.6", + "sort-array": "5.0.0", + "svg-path-commander": "2.1.7", + "tailwindcss": "3.4.10", + "vue": "3.5.13", + "vue-dompurify-html": "5.2.0", + "vue-i18n": "11.0.1", + "vue-router": "4.5.0", + "xml-formatter": "3.6.3" + } +} \ No newline at end of file diff --git a/io.sc.platform.ai.frontend/postcss.config.cjs b/io.sc.platform.ai.frontend/postcss.config.cjs new file mode 100644 index 00000000..f1c8dac8 --- /dev/null +++ b/io.sc.platform.ai.frontend/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + } +} diff --git a/io.sc.platform.ai.frontend/public/configure.js b/io.sc.platform.ai.frontend/public/configure.js new file mode 100644 index 00000000..76840a8b --- /dev/null +++ b/io.sc.platform.ai.frontend/public/configure.js @@ -0,0 +1,43 @@ +// 在浏览器 window 对象中新建名为 APP 的容器变量, 用于存放平台的全局变量 +window.APP = {}; +// 全局配置 +window.APP.configure = { + // 项目名称 + projectName: '', + + // 应用上下文路径 + webContextPath: '[(@{/})]'.startsWith('[') ? '/' : '[(@{/})]', + + // 默认后端 API 请求的服务地址前缀 + apiContextPaths: { + DEFAULT: '[(@{/})]'.startsWith('[') ? 'http://localhost:8080/' : '[(@{/})]', + }, + + // 前端运行环境 + // alone: 前端独立部署, 即前端打包后独立部署于 web 服务上(如: nginx, caddy 等) + // develop: 前端运行在开发环境, 即前端在开发环境下运行(如: webpack) + // backend: 前端运行在后端环境, 即前后端一起打包后部署在应用服务器上(如: tomcat, undertow, jeety等) + fontendScenario: 'develop', + + // router 历史模式 + routerHistoryMode: 'hash', + + // 是否启用本地 mock + enableLocalMock: false, + + // mock 请求响应时间(单位:毫秒) + localMockTimeout: 10, + + // 是否启用使用远程服务端配置 + enableRemoteConfigure: true, + + // 是否首先使用本地路由 + useLocaleRouterFirst: true, + + // axios 配置 + axios: { + baseURL: '', + timeout: 1000 * 60, + crossdomain: true, + }, +}; diff --git a/io.sc.platform.ai.frontend/public/favicon.svg b/io.sc.platform.ai.frontend/public/favicon.svg new file mode 100644 index 00000000..eab5885e --- /dev/null +++ b/io.sc.platform.ai.frontend/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/io.sc.platform.ai.frontend/public/index.html b/io.sc.platform.ai.frontend/public/index.html new file mode 100644 index 00000000..bd6ee3e0 --- /dev/null +++ b/io.sc.platform.ai.frontend/public/index.html @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
正在加载, 请稍后......
+
+
+
+ +
+ + + + diff --git a/io.sc.platform.ai.frontend/public/login-bg.jpg b/io.sc.platform.ai.frontend/public/login-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ecd0dc39e984aba034499dd8b4c9dfcf4466fe94 GIT binary patch literal 240101 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�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�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 Q0=n5+DbWUUxwik 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%0DH>jPaZ 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 z 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 literal 0 HcmV?d00001 diff --git a/io.sc.platform.ai.frontend/public/logo.svg b/io.sc.platform.ai.frontend/public/logo.svg new file mode 100644 index 00000000..2f63474f --- /dev/null +++ b/io.sc.platform.ai.frontend/public/logo.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/io.sc.platform.ai.frontend/public/svg-editor/Editor.js b/io.sc.platform.ai.frontend/public/svg-editor/Editor.js new file mode 100644 index 00000000..293b5b14 --- /dev/null +++ b/io.sc.platform.ai.frontend/public/svg-editor/Editor.js @@ -0,0 +1,52014 @@ +const consoleLogger = { + type: 'logger', + log(args) { + this.output('log', args); + }, + warn(args) { + this.output('warn', args); + }, + error(args) { + this.output('error', args); + }, + output(type, args) { + if (console && console[type]) console[type].apply(console, args); + } +}; +class Logger { + constructor(concreteLogger) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.init(concreteLogger, options); + } + init(concreteLogger) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.prefix = options.prefix || 'i18next:'; + this.logger = concreteLogger || consoleLogger; + this.options = options; + this.debug = options.debug; + } + log() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return this.forward(args, 'log', '', true); + } + warn() { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + return this.forward(args, 'warn', '', true); + } + error() { + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + return this.forward(args, 'error', ''); + } + deprecate() { + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + return this.forward(args, 'warn', 'WARNING DEPRECATED: ', true); + } + forward(args, lvl, prefix, debugOnly) { + if (debugOnly && !this.debug) return null; + if (typeof args[0] === 'string') args[0] = `${prefix}${this.prefix} ${args[0]}`; + return this.logger[lvl](args); + } + create(moduleName) { + return new Logger(this.logger, { + ...{ + prefix: `${this.prefix}:${moduleName}:` + }, + ...this.options + }); + } + clone(options) { + options = options || this.options; + options.prefix = options.prefix || this.prefix; + return new Logger(this.logger, options); + } +} +var baseLogger = new Logger(); +class EventEmitter { + constructor() { + this.observers = {}; + } + on(events, listener) { + events.split(' ').forEach(event => { + this.observers[event] = this.observers[event] || []; + this.observers[event].push(listener); + }); + return this; + } + off(event, listener) { + if (!this.observers[event]) return; + if (!listener) { + delete this.observers[event]; + return; + } + this.observers[event] = this.observers[event].filter(l => l !== listener); + } + emit(event) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + if (this.observers[event]) { + const cloned = [].concat(this.observers[event]); + cloned.forEach(observer => { + observer(...args); + }); + } + if (this.observers['*']) { + const cloned = [].concat(this.observers['*']); + cloned.forEach(observer => { + observer.apply(observer, [event, ...args]); + }); + } + } +} +function defer$1() { + let res; + let rej; + const promise = new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); + promise.resolve = res; + promise.reject = rej; + return promise; +} +function makeString(object) { + if (object == null) return ''; + return '' + object; +} +function copy(a, s, t) { + a.forEach(m => { + if (s[m]) t[m] = s[m]; + }); +} +function getLastOfPath(object, path, Empty) { + function cleanKey(key) { + return key && key.indexOf('###') > -1 ? key.replace(/###/g, '.') : key; + } + function canNotTraverseDeeper() { + return !object || typeof object === 'string'; + } + const stack = typeof path !== 'string' ? [].concat(path) : path.split('.'); + while (stack.length > 1) { + if (canNotTraverseDeeper()) return {}; + const key = cleanKey(stack.shift()); + if (!object[key] && Empty) object[key] = new Empty(); + if (Object.prototype.hasOwnProperty.call(object, key)) { + object = object[key]; + } else { + object = {}; + } + } + if (canNotTraverseDeeper()) return {}; + return { + obj: object, + k: cleanKey(stack.shift()) + }; +} +function setPath(object, path, newValue) { + const { + obj, + k + } = getLastOfPath(object, path, Object); + obj[k] = newValue; +} +function pushPath(object, path, newValue, concat) { + const { + obj, + k + } = getLastOfPath(object, path, Object); + obj[k] = obj[k] || []; + if (concat) obj[k] = obj[k].concat(newValue); + if (!concat) obj[k].push(newValue); +} +function getPath(object, path) { + const { + obj, + k + } = getLastOfPath(object, path); + if (!obj) return undefined; + return obj[k]; +} +function getPathWithDefaults(data, defaultData, key) { + const value = getPath(data, key); + if (value !== undefined) { + return value; + } + return getPath(defaultData, key); +} +function deepExtend(target, source, overwrite) { + for (const prop in source) { + if (prop !== '__proto__' && prop !== 'constructor') { + if (prop in target) { + if (typeof target[prop] === 'string' || target[prop] instanceof String || typeof source[prop] === 'string' || source[prop] instanceof String) { + if (overwrite) target[prop] = source[prop]; + } else { + deepExtend(target[prop], source[prop], overwrite); + } + } else { + target[prop] = source[prop]; + } + } + } + return target; +} +function regexEscape$1(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); +} +var _entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/' +}; +function escape$1(data) { + if (typeof data === 'string') { + return data.replace(/[&<>"'\/]/g, s => _entityMap[s]); + } + return data; +} +const chars = [' ', ',', '?', '!', ';']; +function looksLikeObjectPath(key, nsSeparator, keySeparator) { + nsSeparator = nsSeparator || ''; + keySeparator = keySeparator || ''; + const possibleChars = chars.filter(c => nsSeparator.indexOf(c) < 0 && keySeparator.indexOf(c) < 0); + if (possibleChars.length === 0) return true; + const r = new RegExp(`(${possibleChars.map(c => c === '?' ? '\\?' : c).join('|')})`); + let matched = !r.test(key); + if (!matched) { + const ki = key.indexOf(keySeparator); + if (ki > 0 && !r.test(key.substring(0, ki))) { + matched = true; + } + } + return matched; +} +function deepFind(obj, path) { + let keySeparator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '.'; + if (!obj) return undefined; + if (obj[path]) return obj[path]; + const paths = path.split(keySeparator); + let current = obj; + for (let i = 0; i < paths.length; ++i) { + if (!current) return undefined; + if (typeof current[paths[i]] === 'string' && i + 1 < paths.length) { + return undefined; + } + if (current[paths[i]] === undefined) { + let j = 2; + let p = paths.slice(i, i + j).join(keySeparator); + let mix = current[p]; + while (mix === undefined && paths.length > i + j) { + j++; + p = paths.slice(i, i + j).join(keySeparator); + mix = current[p]; + } + if (mix === undefined) return undefined; + if (mix === null) return null; + if (path.endsWith(p)) { + if (typeof mix === 'string') return mix; + if (p && typeof mix[p] === 'string') return mix[p]; + } + const joinedPath = paths.slice(i + j).join(keySeparator); + if (joinedPath) return deepFind(mix, joinedPath, keySeparator); + return undefined; + } + current = current[paths[i]]; + } + return current; +} +function getCleanedCode(code) { + if (code && code.indexOf('_') > 0) return code.replace('_', '-'); + return code; +} +class ResourceStore extends EventEmitter { + constructor(data) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + ns: ['translation'], + defaultNS: 'translation' + }; + super(); + this.data = data || {}; + this.options = options; + if (this.options.keySeparator === undefined) { + this.options.keySeparator = '.'; + } + if (this.options.ignoreJSONStructure === undefined) { + this.options.ignoreJSONStructure = true; + } + } + addNamespaces(ns) { + if (this.options.ns.indexOf(ns) < 0) { + this.options.ns.push(ns); + } + } + removeNamespaces(ns) { + const index = this.options.ns.indexOf(ns); + if (index > -1) { + this.options.ns.splice(index, 1); + } + } + getResource(lng, ns, key) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator; + const ignoreJSONStructure = options.ignoreJSONStructure !== undefined ? options.ignoreJSONStructure : this.options.ignoreJSONStructure; + let path = [lng, ns]; + if (key && typeof key !== 'string') path = path.concat(key); + if (key && typeof key === 'string') path = path.concat(keySeparator ? key.split(keySeparator) : key); + if (lng.indexOf('.') > -1) { + path = lng.split('.'); + } + const result = getPath(this.data, path); + if (result || !ignoreJSONStructure || typeof key !== 'string') return result; + return deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator); + } + addResource(lng, ns, key, value) { + let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : { + silent: false + }; + const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator; + let path = [lng, ns]; + if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key); + if (lng.indexOf('.') > -1) { + path = lng.split('.'); + value = ns; + ns = path[1]; + } + this.addNamespaces(ns); + setPath(this.data, path, value); + if (!options.silent) this.emit('added', lng, ns, key, value); + } + addResources(lng, ns, resources) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { + silent: false + }; + for (const m in resources) { + if (typeof resources[m] === 'string' || Object.prototype.toString.apply(resources[m]) === '[object Array]') this.addResource(lng, ns, m, resources[m], { + silent: true + }); + } + if (!options.silent) this.emit('added', lng, ns, resources); + } + addResourceBundle(lng, ns, resources, deep, overwrite) { + let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : { + silent: false + }; + let path = [lng, ns]; + if (lng.indexOf('.') > -1) { + path = lng.split('.'); + deep = resources; + resources = ns; + ns = path[1]; + } + this.addNamespaces(ns); + let pack = getPath(this.data, path) || {}; + if (deep) { + deepExtend(pack, resources, overwrite); + } else { + pack = { + ...pack, + ...resources + }; + } + setPath(this.data, path, pack); + if (!options.silent) this.emit('added', lng, ns, resources); + } + removeResourceBundle(lng, ns) { + if (this.hasResourceBundle(lng, ns)) { + delete this.data[lng][ns]; + } + this.removeNamespaces(ns); + this.emit('removed', lng, ns); + } + hasResourceBundle(lng, ns) { + return this.getResource(lng, ns) !== undefined; + } + getResourceBundle(lng, ns) { + if (!ns) ns = this.options.defaultNS; + if (this.options.compatibilityAPI === 'v1') return { + ...{}, + ...this.getResource(lng, ns) + }; + return this.getResource(lng, ns); + } + getDataByLanguage(lng) { + return this.data[lng]; + } + hasLanguageSomeTranslations(lng) { + const data = this.getDataByLanguage(lng); + const n = data && Object.keys(data) || []; + return !!n.find(v => data[v] && Object.keys(data[v]).length > 0); + } + toJSON() { + return this.data; + } +} +var postProcessor = { + processors: {}, + addPostProcessor(module) { + this.processors[module.name] = module; + }, + handle(processors, value, key, options, translator) { + processors.forEach(processor => { + if (this.processors[processor]) value = this.processors[processor].process(value, key, options, translator); + }); + return value; + } +}; +const checkedLoadedFor = {}; +class Translator extends EventEmitter { + constructor(services) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + super(); + copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector', 'i18nFormat', 'utils'], services, this); + this.options = options; + if (this.options.keySeparator === undefined) { + this.options.keySeparator = '.'; + } + this.logger = baseLogger.create('translator'); + } + changeLanguage(lng) { + if (lng) this.language = lng; + } + exists(key) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + interpolation: {} + }; + if (key === undefined || key === null) { + return false; + } + const resolved = this.resolve(key, options); + return resolved && resolved.res !== undefined; + } + extractFromKey(key, options) { + let nsSeparator = options.nsSeparator !== undefined ? options.nsSeparator : this.options.nsSeparator; + if (nsSeparator === undefined) nsSeparator = ':'; + const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator; + let namespaces = options.ns || this.options.defaultNS || []; + const wouldCheckForNsInKey = nsSeparator && key.indexOf(nsSeparator) > -1; + const seemsNaturalLanguage = !this.options.userDefinedKeySeparator && !options.keySeparator && !this.options.userDefinedNsSeparator && !options.nsSeparator && !looksLikeObjectPath(key, nsSeparator, keySeparator); + if (wouldCheckForNsInKey && !seemsNaturalLanguage) { + const m = key.match(this.interpolator.nestingRegexp); + if (m && m.length > 0) { + return { + key, + namespaces + }; + } + const parts = key.split(nsSeparator); + if (nsSeparator !== keySeparator || nsSeparator === keySeparator && this.options.ns.indexOf(parts[0]) > -1) namespaces = parts.shift(); + key = parts.join(keySeparator); + } + if (typeof namespaces === 'string') namespaces = [namespaces]; + return { + key, + namespaces + }; + } + translate(keys, options, lastKey) { + if (typeof options !== 'object' && this.options.overloadTranslationOptionHandler) { + options = this.options.overloadTranslationOptionHandler(arguments); + } + if (typeof options === 'object') options = { + ...options + }; + if (!options) options = {}; + if (keys === undefined || keys === null) return ''; + if (!Array.isArray(keys)) keys = [String(keys)]; + const returnDetails = options.returnDetails !== undefined ? options.returnDetails : this.options.returnDetails; + const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator; + const { + key, + namespaces + } = this.extractFromKey(keys[keys.length - 1], options); + const namespace = namespaces[namespaces.length - 1]; + const lng = options.lng || this.language; + const appendNamespaceToCIMode = options.appendNamespaceToCIMode || this.options.appendNamespaceToCIMode; + if (lng && lng.toLowerCase() === 'cimode') { + if (appendNamespaceToCIMode) { + const nsSeparator = options.nsSeparator || this.options.nsSeparator; + if (returnDetails) { + return { + res: `${namespace}${nsSeparator}${key}`, + usedKey: key, + exactUsedKey: key, + usedLng: lng, + usedNS: namespace, + usedParams: this.getUsedParamsDetails(options) + }; + } + return `${namespace}${nsSeparator}${key}`; + } + if (returnDetails) { + return { + res: key, + usedKey: key, + exactUsedKey: key, + usedLng: lng, + usedNS: namespace, + usedParams: this.getUsedParamsDetails(options) + }; + } + return key; + } + const resolved = this.resolve(keys, options); + let res = resolved && resolved.res; + const resUsedKey = resolved && resolved.usedKey || key; + const resExactUsedKey = resolved && resolved.exactUsedKey || key; + const resType = Object.prototype.toString.apply(res); + const noObject = ['[object Number]', '[object Function]', '[object RegExp]']; + const joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays; + const handleAsObjectInI18nFormat = !this.i18nFormat || this.i18nFormat.handleAsObject; + const handleAsObject = typeof res !== 'string' && typeof res !== 'boolean' && typeof res !== 'number'; + if (handleAsObjectInI18nFormat && res && handleAsObject && noObject.indexOf(resType) < 0 && !(typeof joinArrays === 'string' && resType === '[object Array]')) { + if (!options.returnObjects && !this.options.returnObjects) { + if (!this.options.returnedObjectHandler) { + this.logger.warn('accessing an object - but returnObjects options is not enabled!'); + } + const r = this.options.returnedObjectHandler ? this.options.returnedObjectHandler(resUsedKey, res, { + ...options, + ns: namespaces + }) : `key '${key} (${this.language})' returned an object instead of string.`; + if (returnDetails) { + resolved.res = r; + resolved.usedParams = this.getUsedParamsDetails(options); + return resolved; + } + return r; + } + if (keySeparator) { + const resTypeIsArray = resType === '[object Array]'; + const copy = resTypeIsArray ? [] : {}; + const newKeyToUse = resTypeIsArray ? resExactUsedKey : resUsedKey; + for (const m in res) { + if (Object.prototype.hasOwnProperty.call(res, m)) { + const deepKey = `${newKeyToUse}${keySeparator}${m}`; + copy[m] = this.translate(deepKey, { + ...options, + ...{ + joinArrays: false, + ns: namespaces + } + }); + if (copy[m] === deepKey) copy[m] = res[m]; + } + } + res = copy; + } + } else if (handleAsObjectInI18nFormat && typeof joinArrays === 'string' && resType === '[object Array]') { + res = res.join(joinArrays); + if (res) res = this.extendTranslation(res, keys, options, lastKey); + } else { + let usedDefault = false; + let usedKey = false; + const needsPluralHandling = options.count !== undefined && typeof options.count !== 'string'; + const hasDefaultValue = Translator.hasDefaultValue(options); + const defaultValueSuffix = needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, options) : ''; + const defaultValueSuffixOrdinalFallback = options.ordinal && needsPluralHandling ? this.pluralResolver.getSuffix(lng, options.count, { + ordinal: false + }) : ''; + const defaultValue = options[`defaultValue${defaultValueSuffix}`] || options[`defaultValue${defaultValueSuffixOrdinalFallback}`] || options.defaultValue; + if (!this.isValidLookup(res) && hasDefaultValue) { + usedDefault = true; + res = defaultValue; + } + if (!this.isValidLookup(res)) { + usedKey = true; + res = key; + } + const missingKeyNoValueFallbackToKey = options.missingKeyNoValueFallbackToKey || this.options.missingKeyNoValueFallbackToKey; + const resForMissing = missingKeyNoValueFallbackToKey && usedKey ? undefined : res; + const updateMissing = hasDefaultValue && defaultValue !== res && this.options.updateMissing; + if (usedKey || usedDefault || updateMissing) { + this.logger.log(updateMissing ? 'updateKey' : 'missingKey', lng, namespace, key, updateMissing ? defaultValue : res); + if (keySeparator) { + const fk = this.resolve(key, { + ...options, + keySeparator: false + }); + if (fk && fk.res) this.logger.warn('Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.'); + } + let lngs = []; + const fallbackLngs = this.languageUtils.getFallbackCodes(this.options.fallbackLng, options.lng || this.language); + if (this.options.saveMissingTo === 'fallback' && fallbackLngs && fallbackLngs[0]) { + for (let i = 0; i < fallbackLngs.length; i++) { + lngs.push(fallbackLngs[i]); + } + } else if (this.options.saveMissingTo === 'all') { + lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language); + } else { + lngs.push(options.lng || this.language); + } + const send = (l, k, specificDefaultValue) => { + const defaultForMissing = hasDefaultValue && specificDefaultValue !== res ? specificDefaultValue : resForMissing; + if (this.options.missingKeyHandler) { + this.options.missingKeyHandler(l, namespace, k, defaultForMissing, updateMissing, options); + } else if (this.backendConnector && this.backendConnector.saveMissing) { + this.backendConnector.saveMissing(l, namespace, k, defaultForMissing, updateMissing, options); + } + this.emit('missingKey', l, namespace, k, res); + }; + if (this.options.saveMissing) { + if (this.options.saveMissingPlurals && needsPluralHandling) { + lngs.forEach(language => { + this.pluralResolver.getSuffixes(language, options).forEach(suffix => { + send([language], key + suffix, options[`defaultValue${suffix}`] || defaultValue); + }); + }); + } else { + send(lngs, key, defaultValue); + } + } + } + res = this.extendTranslation(res, keys, options, resolved, lastKey); + if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = `${namespace}:${key}`; + if ((usedKey || usedDefault) && this.options.parseMissingKeyHandler) { + if (this.options.compatibilityAPI !== 'v1') { + res = this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey ? `${namespace}:${key}` : key, usedDefault ? res : undefined); + } else { + res = this.options.parseMissingKeyHandler(res); + } + } + } + if (returnDetails) { + resolved.res = res; + resolved.usedParams = this.getUsedParamsDetails(options); + return resolved; + } + return res; + } + extendTranslation(res, key, options, resolved, lastKey) { + var _this = this; + if (this.i18nFormat && this.i18nFormat.parse) { + res = this.i18nFormat.parse(res, { + ...this.options.interpolation.defaultVariables, + ...options + }, options.lng || this.language || resolved.usedLng, resolved.usedNS, resolved.usedKey, { + resolved + }); + } else if (!options.skipInterpolation) { + if (options.interpolation) this.interpolator.init({ + ...options, + ...{ + interpolation: { + ...this.options.interpolation, + ...options.interpolation + } + } + }); + const skipOnVariables = typeof res === 'string' && (options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables); + let nestBef; + if (skipOnVariables) { + const nb = res.match(this.interpolator.nestingRegexp); + nestBef = nb && nb.length; + } + let data = options.replace && typeof options.replace !== 'string' ? options.replace : options; + if (this.options.interpolation.defaultVariables) data = { + ...this.options.interpolation.defaultVariables, + ...data + }; + res = this.interpolator.interpolate(res, data, options.lng || this.language, options); + if (skipOnVariables) { + const na = res.match(this.interpolator.nestingRegexp); + const nestAft = na && na.length; + if (nestBef < nestAft) options.nest = false; + } + if (!options.lng && this.options.compatibilityAPI !== 'v1' && resolved && resolved.res) options.lng = resolved.usedLng; + if (options.nest !== false) res = this.interpolator.nest(res, function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (lastKey && lastKey[0] === args[0] && !options.context) { + _this.logger.warn(`It seems you are nesting recursively key: ${args[0]} in key: ${key[0]}`); + return null; + } + return _this.translate(...args, key); + }, options); + if (options.interpolation) this.interpolator.reset(); + } + const postProcess = options.postProcess || this.options.postProcess; + const postProcessorNames = typeof postProcess === 'string' ? [postProcess] : postProcess; + if (res !== undefined && res !== null && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) { + res = postProcessor.handle(postProcessorNames, res, key, this.options && this.options.postProcessPassResolved ? { + i18nResolved: { + ...resolved, + usedParams: this.getUsedParamsDetails(options) + }, + ...options + } : options, this); + } + return res; + } + resolve(keys) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let found; + let usedKey; + let exactUsedKey; + let usedLng; + let usedNS; + if (typeof keys === 'string') keys = [keys]; + keys.forEach(k => { + if (this.isValidLookup(found)) return; + const extracted = this.extractFromKey(k, options); + const key = extracted.key; + usedKey = key; + let namespaces = extracted.namespaces; + if (this.options.fallbackNS) namespaces = namespaces.concat(this.options.fallbackNS); + const needsPluralHandling = options.count !== undefined && typeof options.count !== 'string'; + const needsZeroSuffixLookup = needsPluralHandling && !options.ordinal && options.count === 0 && this.pluralResolver.shouldUseIntlApi(); + const needsContextHandling = options.context !== undefined && (typeof options.context === 'string' || typeof options.context === 'number') && options.context !== ''; + const codes = options.lngs ? options.lngs : this.languageUtils.toResolveHierarchy(options.lng || this.language, options.fallbackLng); + namespaces.forEach(ns => { + if (this.isValidLookup(found)) return; + usedNS = ns; + if (!checkedLoadedFor[`${codes[0]}-${ns}`] && this.utils && this.utils.hasLoadedNamespace && !this.utils.hasLoadedNamespace(usedNS)) { + checkedLoadedFor[`${codes[0]}-${ns}`] = true; + this.logger.warn(`key "${usedKey}" for languages "${codes.join(', ')}" won't get resolved as namespace "${usedNS}" was not yet loaded`, 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!'); + } + codes.forEach(code => { + if (this.isValidLookup(found)) return; + usedLng = code; + const finalKeys = [key]; + if (this.i18nFormat && this.i18nFormat.addLookupKeys) { + this.i18nFormat.addLookupKeys(finalKeys, key, code, ns, options); + } else { + let pluralSuffix; + if (needsPluralHandling) pluralSuffix = this.pluralResolver.getSuffix(code, options.count, options); + const zeroSuffix = `${this.options.pluralSeparator}zero`; + const ordinalPrefix = `${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`; + if (needsPluralHandling) { + finalKeys.push(key + pluralSuffix); + if (options.ordinal && pluralSuffix.indexOf(ordinalPrefix) === 0) { + finalKeys.push(key + pluralSuffix.replace(ordinalPrefix, this.options.pluralSeparator)); + } + if (needsZeroSuffixLookup) { + finalKeys.push(key + zeroSuffix); + } + } + if (needsContextHandling) { + const contextKey = `${key}${this.options.contextSeparator}${options.context}`; + finalKeys.push(contextKey); + if (needsPluralHandling) { + finalKeys.push(contextKey + pluralSuffix); + if (options.ordinal && pluralSuffix.indexOf(ordinalPrefix) === 0) { + finalKeys.push(contextKey + pluralSuffix.replace(ordinalPrefix, this.options.pluralSeparator)); + } + if (needsZeroSuffixLookup) { + finalKeys.push(contextKey + zeroSuffix); + } + } + } + } + let possibleKey; + while (possibleKey = finalKeys.pop()) { + if (!this.isValidLookup(found)) { + exactUsedKey = possibleKey; + found = this.getResource(code, ns, possibleKey, options); + } + } + }); + }); + }); + return { + res: found, + usedKey, + exactUsedKey, + usedLng, + usedNS + }; + } + isValidLookup(res) { + return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === ''); + } + getResource(code, ns, key) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + if (this.i18nFormat && this.i18nFormat.getResource) return this.i18nFormat.getResource(code, ns, key, options); + return this.resourceStore.getResource(code, ns, key, options); + } + getUsedParamsDetails() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + const optionsKeys = ['defaultValue', 'ordinal', 'context', 'replace', 'lng', 'lngs', 'fallbackLng', 'ns', 'keySeparator', 'nsSeparator', 'returnObjects', 'returnDetails', 'joinArrays', 'postProcess', 'interpolation']; + const useOptionsReplaceForData = options.replace && typeof options.replace !== 'string'; + let data = useOptionsReplaceForData ? options.replace : options; + if (useOptionsReplaceForData && typeof options.count !== 'undefined') { + data.count = options.count; + } + if (this.options.interpolation.defaultVariables) { + data = { + ...this.options.interpolation.defaultVariables, + ...data + }; + } + if (!useOptionsReplaceForData) { + data = { + ...data + }; + for (const key of optionsKeys) { + delete data[key]; + } + } + return data; + } + static hasDefaultValue(options) { + const prefix = 'defaultValue'; + for (const option in options) { + if (Object.prototype.hasOwnProperty.call(options, option) && prefix === option.substring(0, prefix.length) && undefined !== options[option]) { + return true; + } + } + return false; + } +} +function capitalize(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} +class LanguageUtil { + constructor(options) { + this.options = options; + this.supportedLngs = this.options.supportedLngs || false; + this.logger = baseLogger.create('languageUtils'); + } + getScriptPartFromCode(code) { + code = getCleanedCode(code); + if (!code || code.indexOf('-') < 0) return null; + const p = code.split('-'); + if (p.length === 2) return null; + p.pop(); + if (p[p.length - 1].toLowerCase() === 'x') return null; + return this.formatLanguageCode(p.join('-')); + } + getLanguagePartFromCode(code) { + code = getCleanedCode(code); + if (!code || code.indexOf('-') < 0) return code; + const p = code.split('-'); + return this.formatLanguageCode(p[0]); + } + formatLanguageCode(code) { + if (typeof code === 'string' && code.indexOf('-') > -1) { + const specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab']; + let p = code.split('-'); + if (this.options.lowerCaseLng) { + p = p.map(part => part.toLowerCase()); + } else if (p.length === 2) { + p[0] = p[0].toLowerCase(); + p[1] = p[1].toUpperCase(); + if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase()); + } else if (p.length === 3) { + p[0] = p[0].toLowerCase(); + if (p[1].length === 2) p[1] = p[1].toUpperCase(); + if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase(); + if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase()); + if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase()); + } + return p.join('-'); + } + return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code; + } + isSupportedCode(code) { + if (this.options.load === 'languageOnly' || this.options.nonExplicitSupportedLngs) { + code = this.getLanguagePartFromCode(code); + } + return !this.supportedLngs || !this.supportedLngs.length || this.supportedLngs.indexOf(code) > -1; + } + getBestMatchFromCodes(codes) { + if (!codes) return null; + let found; + codes.forEach(code => { + if (found) return; + const cleanedLng = this.formatLanguageCode(code); + if (!this.options.supportedLngs || this.isSupportedCode(cleanedLng)) found = cleanedLng; + }); + if (!found && this.options.supportedLngs) { + codes.forEach(code => { + if (found) return; + const lngOnly = this.getLanguagePartFromCode(code); + if (this.isSupportedCode(lngOnly)) return found = lngOnly; + found = this.options.supportedLngs.find(supportedLng => { + if (supportedLng === lngOnly) return supportedLng; + if (supportedLng.indexOf('-') < 0 && lngOnly.indexOf('-') < 0) return; + if (supportedLng.indexOf(lngOnly) === 0) return supportedLng; + }); + }); + } + if (!found) found = this.getFallbackCodes(this.options.fallbackLng)[0]; + return found; + } + getFallbackCodes(fallbacks, code) { + if (!fallbacks) return []; + if (typeof fallbacks === 'function') fallbacks = fallbacks(code); + if (typeof fallbacks === 'string') fallbacks = [fallbacks]; + if (Object.prototype.toString.apply(fallbacks) === '[object Array]') return fallbacks; + if (!code) return fallbacks.default || []; + let found = fallbacks[code]; + if (!found) found = fallbacks[this.getScriptPartFromCode(code)]; + if (!found) found = fallbacks[this.formatLanguageCode(code)]; + if (!found) found = fallbacks[this.getLanguagePartFromCode(code)]; + if (!found) found = fallbacks.default; + return found || []; + } + toResolveHierarchy(code, fallbackCode) { + const fallbackCodes = this.getFallbackCodes(fallbackCode || this.options.fallbackLng || [], code); + const codes = []; + const addCode = c => { + if (!c) return; + if (this.isSupportedCode(c)) { + codes.push(c); + } else { + this.logger.warn(`rejecting language code not found in supportedLngs: ${c}`); + } + }; + if (typeof code === 'string' && (code.indexOf('-') > -1 || code.indexOf('_') > -1)) { + if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code)); + if (this.options.load !== 'languageOnly' && this.options.load !== 'currentOnly') addCode(this.getScriptPartFromCode(code)); + if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code)); + } else if (typeof code === 'string') { + addCode(this.formatLanguageCode(code)); + } + fallbackCodes.forEach(fc => { + if (codes.indexOf(fc) < 0) addCode(this.formatLanguageCode(fc)); + }); + return codes; + } +} +let sets = [{ + lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'pt', 'pt-BR', 'tg', 'tl', 'ti', 'tr', 'uz', 'wa'], + nr: [1, 2], + fc: 1 +}, { + lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'hi', 'hu', 'hy', 'ia', 'it', 'kk', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt-PT', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'], + nr: [1, 2], + fc: 2 +}, { + lngs: ['ay', 'bo', 'cgg', 'fa', 'ht', 'id', 'ja', 'jbo', 'ka', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'], + nr: [1], + fc: 3 +}, { + lngs: ['be', 'bs', 'cnr', 'dz', 'hr', 'ru', 'sr', 'uk'], + nr: [1, 2, 5], + fc: 4 +}, { + lngs: ['ar'], + nr: [0, 1, 2, 3, 11, 100], + fc: 5 +}, { + lngs: ['cs', 'sk'], + nr: [1, 2, 5], + fc: 6 +}, { + lngs: ['csb', 'pl'], + nr: [1, 2, 5], + fc: 7 +}, { + lngs: ['cy'], + nr: [1, 2, 3, 8], + fc: 8 +}, { + lngs: ['fr'], + nr: [1, 2], + fc: 9 +}, { + lngs: ['ga'], + nr: [1, 2, 3, 7, 11], + fc: 10 +}, { + lngs: ['gd'], + nr: [1, 2, 3, 20], + fc: 11 +}, { + lngs: ['is'], + nr: [1, 2], + fc: 12 +}, { + lngs: ['jv'], + nr: [0, 1], + fc: 13 +}, { + lngs: ['kw'], + nr: [1, 2, 3, 4], + fc: 14 +}, { + lngs: ['lt'], + nr: [1, 2, 10], + fc: 15 +}, { + lngs: ['lv'], + nr: [1, 2, 0], + fc: 16 +}, { + lngs: ['mk'], + nr: [1, 2], + fc: 17 +}, { + lngs: ['mnk'], + nr: [0, 1, 2], + fc: 18 +}, { + lngs: ['mt'], + nr: [1, 2, 11, 20], + fc: 19 +}, { + lngs: ['or'], + nr: [2, 1], + fc: 2 +}, { + lngs: ['ro'], + nr: [1, 2, 20], + fc: 20 +}, { + lngs: ['sl'], + nr: [5, 1, 2, 3], + fc: 21 +}, { + lngs: ['he', 'iw'], + nr: [1, 2, 20, 21], + fc: 22 +}]; +let _rulesPluralsTypes = { + 1: function (n) { + return Number(n > 1); + }, + 2: function (n) { + return Number(n != 1); + }, + 3: function (n) { + return 0; + }, + 4: function (n) { + return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2); + }, + 5: function (n) { + return Number(n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5); + }, + 6: function (n) { + return Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2); + }, + 7: function (n) { + return Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2); + }, + 8: function (n) { + return Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3); + }, + 9: function (n) { + return Number(n >= 2); + }, + 10: function (n) { + return Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4); + }, + 11: function (n) { + return Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3); + }, + 12: function (n) { + return Number(n % 10 != 1 || n % 100 == 11); + }, + 13: function (n) { + return Number(n !== 0); + }, + 14: function (n) { + return Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3); + }, + 15: function (n) { + return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2); + }, + 16: function (n) { + return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2); + }, + 17: function (n) { + return Number(n == 1 || n % 10 == 1 && n % 100 != 11 ? 0 : 1); + }, + 18: function (n) { + return Number(n == 0 ? 0 : n == 1 ? 1 : 2); + }, + 19: function (n) { + return Number(n == 1 ? 0 : n == 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3); + }, + 20: function (n) { + return Number(n == 1 ? 0 : n == 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2); + }, + 21: function (n) { + return Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0); + }, + 22: function (n) { + return Number(n == 1 ? 0 : n == 2 ? 1 : (n < 0 || n > 10) && n % 10 == 0 ? 2 : 3); + } +}; +const nonIntlVersions = ['v1', 'v2', 'v3']; +const intlVersions = ['v4']; +const suffixesOrder = { + zero: 0, + one: 1, + two: 2, + few: 3, + many: 4, + other: 5 +}; +function createRules() { + const rules = {}; + sets.forEach(set => { + set.lngs.forEach(l => { + rules[l] = { + numbers: set.nr, + plurals: _rulesPluralsTypes[set.fc] + }; + }); + }); + return rules; +} +class PluralResolver { + constructor(languageUtils) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + this.languageUtils = languageUtils; + this.options = options; + this.logger = baseLogger.create('pluralResolver'); + if ((!this.options.compatibilityJSON || intlVersions.includes(this.options.compatibilityJSON)) && (typeof Intl === 'undefined' || !Intl.PluralRules)) { + this.options.compatibilityJSON = 'v3'; + this.logger.error('Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.'); + } + this.rules = createRules(); + } + addRule(lng, obj) { + this.rules[lng] = obj; + } + getRule(code) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (this.shouldUseIntlApi()) { + try { + return new Intl.PluralRules(getCleanedCode(code), { + type: options.ordinal ? 'ordinal' : 'cardinal' + }); + } catch (err) { + return; + } + } + return this.rules[code] || this.rules[this.languageUtils.getLanguagePartFromCode(code)]; + } + needsPlural(code) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const rule = this.getRule(code, options); + if (this.shouldUseIntlApi()) { + return rule && rule.resolvedOptions().pluralCategories.length > 1; + } + return rule && rule.numbers.length > 1; + } + getPluralFormsOfKey(code, key) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + return this.getSuffixes(code, options).map(suffix => `${key}${suffix}`); + } + getSuffixes(code) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const rule = this.getRule(code, options); + if (!rule) { + return []; + } + if (this.shouldUseIntlApi()) { + return rule.resolvedOptions().pluralCategories.sort((pluralCategory1, pluralCategory2) => suffixesOrder[pluralCategory1] - suffixesOrder[pluralCategory2]).map(pluralCategory => `${this.options.prepend}${options.ordinal ? `ordinal${this.options.prepend}` : ''}${pluralCategory}`); + } + return rule.numbers.map(number => this.getSuffix(code, number, options)); + } + getSuffix(code, count) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + const rule = this.getRule(code, options); + if (rule) { + if (this.shouldUseIntlApi()) { + return `${this.options.prepend}${options.ordinal ? `ordinal${this.options.prepend}` : ''}${rule.select(count)}`; + } + return this.getSuffixRetroCompatible(rule, count); + } + this.logger.warn(`no plural rule found for: ${code}`); + return ''; + } + getSuffixRetroCompatible(rule, count) { + const idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count)); + let suffix = rule.numbers[idx]; + if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) { + if (suffix === 2) { + suffix = 'plural'; + } else if (suffix === 1) { + suffix = ''; + } + } + const returnSuffix = () => this.options.prepend && suffix.toString() ? this.options.prepend + suffix.toString() : suffix.toString(); + if (this.options.compatibilityJSON === 'v1') { + if (suffix === 1) return ''; + if (typeof suffix === 'number') return `_plural_${suffix.toString()}`; + return returnSuffix(); + } else if (this.options.compatibilityJSON === 'v2') { + return returnSuffix(); + } else if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) { + return returnSuffix(); + } + return this.options.prepend && idx.toString() ? this.options.prepend + idx.toString() : idx.toString(); + } + shouldUseIntlApi() { + return !nonIntlVersions.includes(this.options.compatibilityJSON); + } +} +function deepFindWithDefaults(data, defaultData, key) { + let keySeparator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '.'; + let ignoreJSONStructure = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + let path = getPathWithDefaults(data, defaultData, key); + if (!path && ignoreJSONStructure && typeof key === 'string') { + path = deepFind(data, key, keySeparator); + if (path === undefined) path = deepFind(defaultData, key, keySeparator); + } + return path; +} +class Interpolator { + constructor() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.logger = baseLogger.create('interpolator'); + this.options = options; + this.format = options.interpolation && options.interpolation.format || (value => value); + this.init(options); + } + init() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (!options.interpolation) options.interpolation = { + escapeValue: true + }; + const iOpts = options.interpolation; + this.escape = iOpts.escape !== undefined ? iOpts.escape : escape$1; + this.escapeValue = iOpts.escapeValue !== undefined ? iOpts.escapeValue : true; + this.useRawValueToEscape = iOpts.useRawValueToEscape !== undefined ? iOpts.useRawValueToEscape : false; + this.prefix = iOpts.prefix ? regexEscape$1(iOpts.prefix) : iOpts.prefixEscaped || '{{'; + this.suffix = iOpts.suffix ? regexEscape$1(iOpts.suffix) : iOpts.suffixEscaped || '}}'; + this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ','; + this.unescapePrefix = iOpts.unescapeSuffix ? '' : iOpts.unescapePrefix || '-'; + this.unescapeSuffix = this.unescapePrefix ? '' : iOpts.unescapeSuffix || ''; + this.nestingPrefix = iOpts.nestingPrefix ? regexEscape$1(iOpts.nestingPrefix) : iOpts.nestingPrefixEscaped || regexEscape$1('$t('); + this.nestingSuffix = iOpts.nestingSuffix ? regexEscape$1(iOpts.nestingSuffix) : iOpts.nestingSuffixEscaped || regexEscape$1(')'); + this.nestingOptionsSeparator = iOpts.nestingOptionsSeparator ? iOpts.nestingOptionsSeparator : iOpts.nestingOptionsSeparator || ','; + this.maxReplaces = iOpts.maxReplaces ? iOpts.maxReplaces : 1000; + this.alwaysFormat = iOpts.alwaysFormat !== undefined ? iOpts.alwaysFormat : false; + this.resetRegExp(); + } + reset() { + if (this.options) this.init(this.options); + } + resetRegExp() { + const regexpStr = `${this.prefix}(.+?)${this.suffix}`; + this.regexp = new RegExp(regexpStr, 'g'); + const regexpUnescapeStr = `${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`; + this.regexpUnescape = new RegExp(regexpUnescapeStr, 'g'); + const nestingRegexpStr = `${this.nestingPrefix}(.+?)${this.nestingSuffix}`; + this.nestingRegexp = new RegExp(nestingRegexpStr, 'g'); + } + interpolate(str, data, lng, options) { + let match; + let value; + let replaces; + const defaultData = this.options && this.options.interpolation && this.options.interpolation.defaultVariables || {}; + function regexSafe(val) { + return val.replace(/\$/g, '$$$$'); + } + const handleFormat = key => { + if (key.indexOf(this.formatSeparator) < 0) { + const path = deepFindWithDefaults(data, defaultData, key, this.options.keySeparator, this.options.ignoreJSONStructure); + return this.alwaysFormat ? this.format(path, undefined, lng, { + ...options, + ...data, + interpolationkey: key + }) : path; + } + const p = key.split(this.formatSeparator); + const k = p.shift().trim(); + const f = p.join(this.formatSeparator).trim(); + return this.format(deepFindWithDefaults(data, defaultData, k, this.options.keySeparator, this.options.ignoreJSONStructure), f, lng, { + ...options, + ...data, + interpolationkey: k + }); + }; + this.resetRegExp(); + const missingInterpolationHandler = options && options.missingInterpolationHandler || this.options.missingInterpolationHandler; + const skipOnVariables = options && options.interpolation && options.interpolation.skipOnVariables !== undefined ? options.interpolation.skipOnVariables : this.options.interpolation.skipOnVariables; + const todos = [{ + regex: this.regexpUnescape, + safeValue: val => regexSafe(val) + }, { + regex: this.regexp, + safeValue: val => this.escapeValue ? regexSafe(this.escape(val)) : regexSafe(val) + }]; + todos.forEach(todo => { + replaces = 0; + while (match = todo.regex.exec(str)) { + const matchedVar = match[1].trim(); + value = handleFormat(matchedVar); + if (value === undefined) { + if (typeof missingInterpolationHandler === 'function') { + const temp = missingInterpolationHandler(str, match, options); + value = typeof temp === 'string' ? temp : ''; + } else if (options && Object.prototype.hasOwnProperty.call(options, matchedVar)) { + value = ''; + } else if (skipOnVariables) { + value = match[0]; + continue; + } else { + this.logger.warn(`missed to pass in variable ${matchedVar} for interpolating ${str}`); + value = ''; + } + } else if (typeof value !== 'string' && !this.useRawValueToEscape) { + value = makeString(value); + } + const safeValue = todo.safeValue(value); + str = str.replace(match[0], safeValue); + if (skipOnVariables) { + todo.regex.lastIndex += value.length; + todo.regex.lastIndex -= match[0].length; + } else { + todo.regex.lastIndex = 0; + } + replaces++; + if (replaces >= this.maxReplaces) { + break; + } + } + }); + return str; + } + nest(str, fc) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let match; + let value; + let clonedOptions; + function handleHasOptions(key, inheritedOptions) { + const sep = this.nestingOptionsSeparator; + if (key.indexOf(sep) < 0) return key; + const c = key.split(new RegExp(`${sep}[ ]*{`)); + let optionsString = `{${c[1]}`; + key = c[0]; + optionsString = this.interpolate(optionsString, clonedOptions); + const matchedSingleQuotes = optionsString.match(/'/g); + const matchedDoubleQuotes = optionsString.match(/"/g); + if (matchedSingleQuotes && matchedSingleQuotes.length % 2 === 0 && !matchedDoubleQuotes || matchedDoubleQuotes.length % 2 !== 0) { + optionsString = optionsString.replace(/'/g, '"'); + } + try { + clonedOptions = JSON.parse(optionsString); + if (inheritedOptions) clonedOptions = { + ...inheritedOptions, + ...clonedOptions + }; + } catch (e) { + this.logger.warn(`failed parsing options string in nesting for key ${key}`, e); + return `${key}${sep}${optionsString}`; + } + delete clonedOptions.defaultValue; + return key; + } + while (match = this.nestingRegexp.exec(str)) { + let formatters = []; + clonedOptions = { + ...options + }; + clonedOptions = clonedOptions.replace && typeof clonedOptions.replace !== 'string' ? clonedOptions.replace : clonedOptions; + clonedOptions.applyPostProcessor = false; + delete clonedOptions.defaultValue; + let doReduce = false; + if (match[0].indexOf(this.formatSeparator) !== -1 && !/{.*}/.test(match[1])) { + const r = match[1].split(this.formatSeparator).map(elem => elem.trim()); + match[1] = r.shift(); + formatters = r; + doReduce = true; + } + value = fc(handleHasOptions.call(this, match[1].trim(), clonedOptions), clonedOptions); + if (value && match[0] === str && typeof value !== 'string') return value; + if (typeof value !== 'string') value = makeString(value); + if (!value) { + this.logger.warn(`missed to resolve ${match[1]} for nesting ${str}`); + value = ''; + } + if (doReduce) { + value = formatters.reduce((v, f) => this.format(v, f, options.lng, { + ...options, + interpolationkey: match[1].trim() + }), value.trim()); + } + str = str.replace(match[0], value); + this.regexp.lastIndex = 0; + } + return str; + } +} +function parseFormatStr(formatStr) { + let formatName = formatStr.toLowerCase().trim(); + const formatOptions = {}; + if (formatStr.indexOf('(') > -1) { + const p = formatStr.split('('); + formatName = p[0].toLowerCase().trim(); + const optStr = p[1].substring(0, p[1].length - 1); + if (formatName === 'currency' && optStr.indexOf(':') < 0) { + if (!formatOptions.currency) formatOptions.currency = optStr.trim(); + } else if (formatName === 'relativetime' && optStr.indexOf(':') < 0) { + if (!formatOptions.range) formatOptions.range = optStr.trim(); + } else { + const opts = optStr.split(';'); + opts.forEach(opt => { + if (!opt) return; + const [key, ...rest] = opt.split(':'); + const val = rest.join(':').trim().replace(/^'+|'+$/g, ''); + if (!formatOptions[key.trim()]) formatOptions[key.trim()] = val; + if (val === 'false') formatOptions[key.trim()] = false; + if (val === 'true') formatOptions[key.trim()] = true; + if (!isNaN(val)) formatOptions[key.trim()] = parseInt(val, 10); + }); + } + } + return { + formatName, + formatOptions + }; +} +function createCachedFormatter(fn) { + const cache = {}; + return function invokeFormatter(val, lng, options) { + const key = lng + JSON.stringify(options); + let formatter = cache[key]; + if (!formatter) { + formatter = fn(getCleanedCode(lng), options); + cache[key] = formatter; + } + return formatter(val); + }; +} +class Formatter { + constructor() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.logger = baseLogger.create('formatter'); + this.options = options; + this.formats = { + number: createCachedFormatter((lng, opt) => { + const formatter = new Intl.NumberFormat(lng, { + ...opt + }); + return val => formatter.format(val); + }), + currency: createCachedFormatter((lng, opt) => { + const formatter = new Intl.NumberFormat(lng, { + ...opt, + style: 'currency' + }); + return val => formatter.format(val); + }), + datetime: createCachedFormatter((lng, opt) => { + const formatter = new Intl.DateTimeFormat(lng, { + ...opt + }); + return val => formatter.format(val); + }), + relativetime: createCachedFormatter((lng, opt) => { + const formatter = new Intl.RelativeTimeFormat(lng, { + ...opt + }); + return val => formatter.format(val, opt.range || 'day'); + }), + list: createCachedFormatter((lng, opt) => { + const formatter = new Intl.ListFormat(lng, { + ...opt + }); + return val => formatter.format(val); + }) + }; + this.init(options); + } + init(services) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + interpolation: {} + }; + const iOpts = options.interpolation; + this.formatSeparator = iOpts.formatSeparator ? iOpts.formatSeparator : iOpts.formatSeparator || ','; + } + add(name, fc) { + this.formats[name.toLowerCase().trim()] = fc; + } + addCached(name, fc) { + this.formats[name.toLowerCase().trim()] = createCachedFormatter(fc); + } + format(value, format, lng) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + const formats = format.split(this.formatSeparator); + const result = formats.reduce((mem, f) => { + const { + formatName, + formatOptions + } = parseFormatStr(f); + if (this.formats[formatName]) { + let formatted = mem; + try { + const valOptions = options && options.formatParams && options.formatParams[options.interpolationkey] || {}; + const l = valOptions.locale || valOptions.lng || options.locale || options.lng || lng; + formatted = this.formats[formatName](mem, l, { + ...formatOptions, + ...options, + ...valOptions + }); + } catch (error) { + this.logger.warn(error); + } + return formatted; + } else { + this.logger.warn(`there was no format function for ${formatName}`); + } + return mem; + }, value); + return result; + } +} +function removePending(q, name) { + if (q.pending[name] !== undefined) { + delete q.pending[name]; + q.pendingCount--; + } +} +class Connector extends EventEmitter { + constructor(backend, store, services) { + let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + super(); + this.backend = backend; + this.store = store; + this.services = services; + this.languageUtils = services.languageUtils; + this.options = options; + this.logger = baseLogger.create('backendConnector'); + this.waitingReads = []; + this.maxParallelReads = options.maxParallelReads || 10; + this.readingCalls = 0; + this.maxRetries = options.maxRetries >= 0 ? options.maxRetries : 5; + this.retryTimeout = options.retryTimeout >= 1 ? options.retryTimeout : 350; + this.state = {}; + this.queue = []; + if (this.backend && this.backend.init) { + this.backend.init(services, options.backend, options); + } + } + queueLoad(languages, namespaces, options, callback) { + const toLoad = {}; + const pending = {}; + const toLoadLanguages = {}; + const toLoadNamespaces = {}; + languages.forEach(lng => { + let hasAllNamespaces = true; + namespaces.forEach(ns => { + const name = `${lng}|${ns}`; + if (!options.reload && this.store.hasResourceBundle(lng, ns)) { + this.state[name] = 2; + } else if (this.state[name] < 0) ;else if (this.state[name] === 1) { + if (pending[name] === undefined) pending[name] = true; + } else { + this.state[name] = 1; + hasAllNamespaces = false; + if (pending[name] === undefined) pending[name] = true; + if (toLoad[name] === undefined) toLoad[name] = true; + if (toLoadNamespaces[ns] === undefined) toLoadNamespaces[ns] = true; + } + }); + if (!hasAllNamespaces) toLoadLanguages[lng] = true; + }); + if (Object.keys(toLoad).length || Object.keys(pending).length) { + this.queue.push({ + pending, + pendingCount: Object.keys(pending).length, + loaded: {}, + errors: [], + callback + }); + } + return { + toLoad: Object.keys(toLoad), + pending: Object.keys(pending), + toLoadLanguages: Object.keys(toLoadLanguages), + toLoadNamespaces: Object.keys(toLoadNamespaces) + }; + } + loaded(name, err, data) { + const s = name.split('|'); + const lng = s[0]; + const ns = s[1]; + if (err) this.emit('failedLoading', lng, ns, err); + if (data) { + this.store.addResourceBundle(lng, ns, data); + } + this.state[name] = err ? -1 : 2; + const loaded = {}; + this.queue.forEach(q => { + pushPath(q.loaded, [lng], ns); + removePending(q, name); + if (err) q.errors.push(err); + if (q.pendingCount === 0 && !q.done) { + Object.keys(q.loaded).forEach(l => { + if (!loaded[l]) loaded[l] = {}; + const loadedKeys = q.loaded[l]; + if (loadedKeys.length) { + loadedKeys.forEach(n => { + if (loaded[l][n] === undefined) loaded[l][n] = true; + }); + } + }); + q.done = true; + if (q.errors.length) { + q.callback(q.errors); + } else { + q.callback(); + } + } + }); + this.emit('loaded', loaded); + this.queue = this.queue.filter(q => !q.done); + } + read(lng, ns, fcName) { + let tried = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; + let wait = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.retryTimeout; + let callback = arguments.length > 5 ? arguments[5] : undefined; + if (!lng.length) return callback(null, {}); + if (this.readingCalls >= this.maxParallelReads) { + this.waitingReads.push({ + lng, + ns, + fcName, + tried, + wait, + callback + }); + return; + } + this.readingCalls++; + const resolver = (err, data) => { + this.readingCalls--; + if (this.waitingReads.length > 0) { + const next = this.waitingReads.shift(); + this.read(next.lng, next.ns, next.fcName, next.tried, next.wait, next.callback); + } + if (err && data && tried < this.maxRetries) { + setTimeout(() => { + this.read.call(this, lng, ns, fcName, tried + 1, wait * 2, callback); + }, wait); + return; + } + callback(err, data); + }; + const fc = this.backend[fcName].bind(this.backend); + if (fc.length === 2) { + try { + const r = fc(lng, ns); + if (r && typeof r.then === 'function') { + r.then(data => resolver(null, data)).catch(resolver); + } else { + resolver(null, r); + } + } catch (err) { + resolver(err); + } + return; + } + return fc(lng, ns, resolver); + } + prepareLoading(languages, namespaces) { + let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + let callback = arguments.length > 3 ? arguments[3] : undefined; + if (!this.backend) { + this.logger.warn('No backend was added via i18next.use. Will not load resources.'); + return callback && callback(); + } + if (typeof languages === 'string') languages = this.languageUtils.toResolveHierarchy(languages); + if (typeof namespaces === 'string') namespaces = [namespaces]; + const toLoad = this.queueLoad(languages, namespaces, options, callback); + if (!toLoad.toLoad.length) { + if (!toLoad.pending.length) callback(); + return null; + } + toLoad.toLoad.forEach(name => { + this.loadOne(name); + }); + } + load(languages, namespaces, callback) { + this.prepareLoading(languages, namespaces, {}, callback); + } + reload(languages, namespaces, callback) { + this.prepareLoading(languages, namespaces, { + reload: true + }, callback); + } + loadOne(name) { + let prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + const s = name.split('|'); + const lng = s[0]; + const ns = s[1]; + this.read(lng, ns, 'read', undefined, undefined, (err, data) => { + if (err) this.logger.warn(`${prefix}loading namespace ${ns} for language ${lng} failed`, err); + if (!err && data) this.logger.log(`${prefix}loaded namespace ${ns} for language ${lng}`, data); + this.loaded(name, err, data); + }); + } + saveMissing(languages, namespace, key, fallbackValue, isUpdate) { + let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + let clb = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : () => {}; + if (this.services.utils && this.services.utils.hasLoadedNamespace && !this.services.utils.hasLoadedNamespace(namespace)) { + this.logger.warn(`did not save key "${key}" as the namespace "${namespace}" was not yet loaded`, 'This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!'); + return; + } + if (key === undefined || key === null || key === '') return; + if (this.backend && this.backend.create) { + const opts = { + ...options, + isUpdate + }; + const fc = this.backend.create.bind(this.backend); + if (fc.length < 6) { + try { + let r; + if (fc.length === 5) { + r = fc(languages, namespace, key, fallbackValue, opts); + } else { + r = fc(languages, namespace, key, fallbackValue); + } + if (r && typeof r.then === 'function') { + r.then(data => clb(null, data)).catch(clb); + } else { + clb(null, r); + } + } catch (err) { + clb(err); + } + } else { + fc(languages, namespace, key, fallbackValue, clb, opts); + } + } + if (!languages || !languages[0]) return; + this.store.addResource(languages[0], namespace, key, fallbackValue); + } +} +function get$1() { + return { + debug: false, + initImmediate: true, + ns: ['translation'], + defaultNS: ['translation'], + fallbackLng: ['dev'], + fallbackNS: false, + supportedLngs: false, + nonExplicitSupportedLngs: false, + load: 'all', + preload: false, + simplifyPluralSuffix: true, + keySeparator: '.', + nsSeparator: ':', + pluralSeparator: '_', + contextSeparator: '_', + partialBundledLanguages: false, + saveMissing: false, + updateMissing: false, + saveMissingTo: 'fallback', + saveMissingPlurals: true, + missingKeyHandler: false, + missingInterpolationHandler: false, + postProcess: false, + postProcessPassResolved: false, + returnNull: false, + returnEmptyString: true, + returnObjects: false, + joinArrays: false, + returnedObjectHandler: false, + parseMissingKeyHandler: false, + appendNamespaceToMissingKey: false, + appendNamespaceToCIMode: false, + overloadTranslationOptionHandler: function handle(args) { + let ret = {}; + if (typeof args[1] === 'object') ret = args[1]; + if (typeof args[1] === 'string') ret.defaultValue = args[1]; + if (typeof args[2] === 'string') ret.tDescription = args[2]; + if (typeof args[2] === 'object' || typeof args[3] === 'object') { + const options = args[3] || args[2]; + Object.keys(options).forEach(key => { + ret[key] = options[key]; + }); + } + return ret; + }, + interpolation: { + escapeValue: true, + format: (value, format, lng, options) => value, + prefix: '{{', + suffix: '}}', + formatSeparator: ',', + unescapePrefix: '-', + nestingPrefix: '$t(', + nestingSuffix: ')', + nestingOptionsSeparator: ',', + maxReplaces: 1000, + skipOnVariables: true + } + }; +} +function transformOptions(options) { + if (typeof options.ns === 'string') options.ns = [options.ns]; + if (typeof options.fallbackLng === 'string') options.fallbackLng = [options.fallbackLng]; + if (typeof options.fallbackNS === 'string') options.fallbackNS = [options.fallbackNS]; + if (options.supportedLngs && options.supportedLngs.indexOf('cimode') < 0) { + options.supportedLngs = options.supportedLngs.concat(['cimode']); + } + return options; +} +function noop$2() {} +function bindMemberFunctions(inst) { + const mems = Object.getOwnPropertyNames(Object.getPrototypeOf(inst)); + mems.forEach(mem => { + if (typeof inst[mem] === 'function') { + inst[mem] = inst[mem].bind(inst); + } + }); +} +class I18n extends EventEmitter { + constructor() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let callback = arguments.length > 1 ? arguments[1] : undefined; + super(); + this.options = transformOptions(options); + this.services = {}; + this.logger = baseLogger; + this.modules = { + external: [] + }; + bindMemberFunctions(this); + if (callback && !this.isInitialized && !options.isClone) { + if (!this.options.initImmediate) { + this.init(options, callback); + return this; + } + setTimeout(() => { + this.init(options, callback); + }, 0); + } + } + init() { + var _this = this; + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let callback = arguments.length > 1 ? arguments[1] : undefined; + if (typeof options === 'function') { + callback = options; + options = {}; + } + if (!options.defaultNS && options.defaultNS !== false && options.ns) { + if (typeof options.ns === 'string') { + options.defaultNS = options.ns; + } else if (options.ns.indexOf('translation') < 0) { + options.defaultNS = options.ns[0]; + } + } + const defOpts = get$1(); + this.options = { + ...defOpts, + ...this.options, + ...transformOptions(options) + }; + if (this.options.compatibilityAPI !== 'v1') { + this.options.interpolation = { + ...defOpts.interpolation, + ...this.options.interpolation + }; + } + if (options.keySeparator !== undefined) { + this.options.userDefinedKeySeparator = options.keySeparator; + } + if (options.nsSeparator !== undefined) { + this.options.userDefinedNsSeparator = options.nsSeparator; + } + function createClassOnDemand(ClassOrObject) { + if (!ClassOrObject) return null; + if (typeof ClassOrObject === 'function') return new ClassOrObject(); + return ClassOrObject; + } + if (!this.options.isClone) { + if (this.modules.logger) { + baseLogger.init(createClassOnDemand(this.modules.logger), this.options); + } else { + baseLogger.init(null, this.options); + } + let formatter; + if (this.modules.formatter) { + formatter = this.modules.formatter; + } else if (typeof Intl !== 'undefined') { + formatter = Formatter; + } + const lu = new LanguageUtil(this.options); + this.store = new ResourceStore(this.options.resources, this.options); + const s = this.services; + s.logger = baseLogger; + s.resourceStore = this.store; + s.languageUtils = lu; + s.pluralResolver = new PluralResolver(lu, { + prepend: this.options.pluralSeparator, + compatibilityJSON: this.options.compatibilityJSON, + simplifyPluralSuffix: this.options.simplifyPluralSuffix + }); + if (formatter && (!this.options.interpolation.format || this.options.interpolation.format === defOpts.interpolation.format)) { + s.formatter = createClassOnDemand(formatter); + s.formatter.init(s, this.options); + this.options.interpolation.format = s.formatter.format.bind(s.formatter); + } + s.interpolator = new Interpolator(this.options); + s.utils = { + hasLoadedNamespace: this.hasLoadedNamespace.bind(this) + }; + s.backendConnector = new Connector(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options); + s.backendConnector.on('*', function (event) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + _this.emit(event, ...args); + }); + if (this.modules.languageDetector) { + s.languageDetector = createClassOnDemand(this.modules.languageDetector); + if (s.languageDetector.init) s.languageDetector.init(s, this.options.detection, this.options); + } + if (this.modules.i18nFormat) { + s.i18nFormat = createClassOnDemand(this.modules.i18nFormat); + if (s.i18nFormat.init) s.i18nFormat.init(this); + } + this.translator = new Translator(this.services, this.options); + this.translator.on('*', function (event) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + _this.emit(event, ...args); + }); + this.modules.external.forEach(m => { + if (m.init) m.init(this); + }); + } + this.format = this.options.interpolation.format; + if (!callback) callback = noop$2; + if (this.options.fallbackLng && !this.services.languageDetector && !this.options.lng) { + const codes = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng); + if (codes.length > 0 && codes[0] !== 'dev') this.options.lng = codes[0]; + } + if (!this.services.languageDetector && !this.options.lng) { + this.logger.warn('init: no languageDetector is used and no lng is defined'); + } + const storeApi = ['getResource', 'hasResourceBundle', 'getResourceBundle', 'getDataByLanguage']; + storeApi.forEach(fcName => { + this[fcName] = function () { + return _this.store[fcName](...arguments); + }; + }); + const storeApiChained = ['addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle']; + storeApiChained.forEach(fcName => { + this[fcName] = function () { + _this.store[fcName](...arguments); + return _this; + }; + }); + const deferred = defer$1(); + const load = () => { + const finish = (err, t) => { + if (this.isInitialized && !this.initializedStoreOnce) this.logger.warn('init: i18next is already initialized. You should call init just once!'); + this.isInitialized = true; + if (!this.options.isClone) this.logger.log('initialized', this.options); + this.emit('initialized', this.options); + deferred.resolve(t); + callback(err, t); + }; + if (this.languages && this.options.compatibilityAPI !== 'v1' && !this.isInitialized) return finish(null, this.t.bind(this)); + this.changeLanguage(this.options.lng, finish); + }; + if (this.options.resources || !this.options.initImmediate) { + load(); + } else { + setTimeout(load, 0); + } + return deferred; + } + loadResources(language) { + let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop$2; + let usedCallback = callback; + const usedLng = typeof language === 'string' ? language : this.language; + if (typeof language === 'function') usedCallback = language; + if (!this.options.resources || this.options.partialBundledLanguages) { + if (usedLng && usedLng.toLowerCase() === 'cimode' && (!this.options.preload || this.options.preload.length === 0)) return usedCallback(); + const toLoad = []; + const append = lng => { + if (!lng) return; + if (lng === 'cimode') return; + const lngs = this.services.languageUtils.toResolveHierarchy(lng); + lngs.forEach(l => { + if (l === 'cimode') return; + if (toLoad.indexOf(l) < 0) toLoad.push(l); + }); + }; + if (!usedLng) { + const fallbacks = this.services.languageUtils.getFallbackCodes(this.options.fallbackLng); + fallbacks.forEach(l => append(l)); + } else { + append(usedLng); + } + if (this.options.preload) { + this.options.preload.forEach(l => append(l)); + } + this.services.backendConnector.load(toLoad, this.options.ns, e => { + if (!e && !this.resolvedLanguage && this.language) this.setResolvedLanguage(this.language); + usedCallback(e); + }); + } else { + usedCallback(null); + } + } + reloadResources(lngs, ns, callback) { + const deferred = defer$1(); + if (!lngs) lngs = this.languages; + if (!ns) ns = this.options.ns; + if (!callback) callback = noop$2; + this.services.backendConnector.reload(lngs, ns, err => { + deferred.resolve(); + callback(err); + }); + return deferred; + } + use(module) { + if (!module) throw new Error('You are passing an undefined module! Please check the object you are passing to i18next.use()'); + if (!module.type) throw new Error('You are passing a wrong module! Please check the object you are passing to i18next.use()'); + if (module.type === 'backend') { + this.modules.backend = module; + } + if (module.type === 'logger' || module.log && module.warn && module.error) { + this.modules.logger = module; + } + if (module.type === 'languageDetector') { + this.modules.languageDetector = module; + } + if (module.type === 'i18nFormat') { + this.modules.i18nFormat = module; + } + if (module.type === 'postProcessor') { + postProcessor.addPostProcessor(module); + } + if (module.type === 'formatter') { + this.modules.formatter = module; + } + if (module.type === '3rdParty') { + this.modules.external.push(module); + } + return this; + } + setResolvedLanguage(l) { + if (!l || !this.languages) return; + if (['cimode', 'dev'].indexOf(l) > -1) return; + for (let li = 0; li < this.languages.length; li++) { + const lngInLngs = this.languages[li]; + if (['cimode', 'dev'].indexOf(lngInLngs) > -1) continue; + if (this.store.hasLanguageSomeTranslations(lngInLngs)) { + this.resolvedLanguage = lngInLngs; + break; + } + } + } + changeLanguage(lng, callback) { + var _this2 = this; + this.isLanguageChangingTo = lng; + const deferred = defer$1(); + this.emit('languageChanging', lng); + const setLngProps = l => { + this.language = l; + this.languages = this.services.languageUtils.toResolveHierarchy(l); + this.resolvedLanguage = undefined; + this.setResolvedLanguage(l); + }; + const done = (err, l) => { + if (l) { + setLngProps(l); + this.translator.changeLanguage(l); + this.isLanguageChangingTo = undefined; + this.emit('languageChanged', l); + this.logger.log('languageChanged', l); + } else { + this.isLanguageChangingTo = undefined; + } + deferred.resolve(function () { + return _this2.t(...arguments); + }); + if (callback) callback(err, function () { + return _this2.t(...arguments); + }); + }; + const setLng = lngs => { + if (!lng && !lngs && this.services.languageDetector) lngs = []; + const l = typeof lngs === 'string' ? lngs : this.services.languageUtils.getBestMatchFromCodes(lngs); + if (l) { + if (!this.language) { + setLngProps(l); + } + if (!this.translator.language) this.translator.changeLanguage(l); + if (this.services.languageDetector && this.services.languageDetector.cacheUserLanguage) this.services.languageDetector.cacheUserLanguage(l); + } + this.loadResources(l, err => { + done(err, l); + }); + }; + if (!lng && this.services.languageDetector && !this.services.languageDetector.async) { + setLng(this.services.languageDetector.detect()); + } else if (!lng && this.services.languageDetector && this.services.languageDetector.async) { + if (this.services.languageDetector.detect.length === 0) { + this.services.languageDetector.detect().then(setLng); + } else { + this.services.languageDetector.detect(setLng); + } + } else { + setLng(lng); + } + return deferred; + } + getFixedT(lng, ns, keyPrefix) { + var _this3 = this; + const fixedT = function (key, opts) { + let options; + if (typeof opts !== 'object') { + for (var _len3 = arguments.length, rest = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) { + rest[_key3 - 2] = arguments[_key3]; + } + options = _this3.options.overloadTranslationOptionHandler([key, opts].concat(rest)); + } else { + options = { + ...opts + }; + } + options.lng = options.lng || fixedT.lng; + options.lngs = options.lngs || fixedT.lngs; + options.ns = options.ns || fixedT.ns; + options.keyPrefix = options.keyPrefix || keyPrefix || fixedT.keyPrefix; + const keySeparator = _this3.options.keySeparator || '.'; + let resultKey; + if (options.keyPrefix && Array.isArray(key)) { + resultKey = key.map(k => `${options.keyPrefix}${keySeparator}${k}`); + } else { + resultKey = options.keyPrefix ? `${options.keyPrefix}${keySeparator}${key}` : key; + } + return _this3.t(resultKey, options); + }; + if (typeof lng === 'string') { + fixedT.lng = lng; + } else { + fixedT.lngs = lng; + } + fixedT.ns = ns; + fixedT.keyPrefix = keyPrefix; + return fixedT; + } + t() { + return this.translator && this.translator.translate(...arguments); + } + exists() { + return this.translator && this.translator.exists(...arguments); + } + setDefaultNamespace(ns) { + this.options.defaultNS = ns; + } + hasLoadedNamespace(ns) { + let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (!this.isInitialized) { + this.logger.warn('hasLoadedNamespace: i18next was not initialized', this.languages); + return false; + } + if (!this.languages || !this.languages.length) { + this.logger.warn('hasLoadedNamespace: i18n.languages were undefined or empty', this.languages); + return false; + } + const lng = options.lng || this.resolvedLanguage || this.languages[0]; + const fallbackLng = this.options ? this.options.fallbackLng : false; + const lastLng = this.languages[this.languages.length - 1]; + if (lng.toLowerCase() === 'cimode') return true; + const loadNotPending = (l, n) => { + const loadState = this.services.backendConnector.state[`${l}|${n}`]; + return loadState === -1 || loadState === 2; + }; + if (options.precheck) { + const preResult = options.precheck(this, loadNotPending); + if (preResult !== undefined) return preResult; + } + if (this.hasResourceBundle(lng, ns)) return true; + if (!this.services.backendConnector.backend || this.options.resources && !this.options.partialBundledLanguages) return true; + if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true; + return false; + } + loadNamespaces(ns, callback) { + const deferred = defer$1(); + if (!this.options.ns) { + if (callback) callback(); + return Promise.resolve(); + } + if (typeof ns === 'string') ns = [ns]; + ns.forEach(n => { + if (this.options.ns.indexOf(n) < 0) this.options.ns.push(n); + }); + this.loadResources(err => { + deferred.resolve(); + if (callback) callback(err); + }); + return deferred; + } + loadLanguages(lngs, callback) { + const deferred = defer$1(); + if (typeof lngs === 'string') lngs = [lngs]; + const preloaded = this.options.preload || []; + const newLngs = lngs.filter(lng => preloaded.indexOf(lng) < 0); + if (!newLngs.length) { + if (callback) callback(); + return Promise.resolve(); + } + this.options.preload = preloaded.concat(newLngs); + this.loadResources(err => { + deferred.resolve(); + if (callback) callback(err); + }); + return deferred; + } + dir(lng) { + if (!lng) lng = this.resolvedLanguage || (this.languages && this.languages.length > 0 ? this.languages[0] : this.language); + if (!lng) return 'rtl'; + const rtlLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ug', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam', 'ckb']; + const languageUtils = this.services && this.services.languageUtils || new LanguageUtil(get$1()); + return rtlLngs.indexOf(languageUtils.getLanguagePartFromCode(lng)) > -1 || lng.toLowerCase().indexOf('-arab') > 1 ? 'rtl' : 'ltr'; + } + static createInstance() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let callback = arguments.length > 1 ? arguments[1] : undefined; + return new I18n(options, callback); + } + cloneInstance() { + let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop$2; + const forkResourceStore = options.forkResourceStore; + if (forkResourceStore) delete options.forkResourceStore; + const mergedOptions = { + ...this.options, + ...options, + ...{ + isClone: true + } + }; + const clone = new I18n(mergedOptions); + if (options.debug !== undefined || options.prefix !== undefined) { + clone.logger = clone.logger.clone(options); + } + const membersToCopy = ['store', 'services', 'language']; + membersToCopy.forEach(m => { + clone[m] = this[m]; + }); + clone.services = { + ...this.services + }; + clone.services.utils = { + hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone) + }; + if (forkResourceStore) { + clone.store = new ResourceStore(this.store.data, mergedOptions); + clone.services.resourceStore = clone.store; + } + clone.translator = new Translator(clone.services, mergedOptions); + clone.translator.on('*', function (event) { + for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + args[_key4 - 1] = arguments[_key4]; + } + clone.emit(event, ...args); + }); + clone.init(mergedOptions, callback); + clone.translator.options = mergedOptions; + clone.translator.backendConnector.services.utils = { + hasLoadedNamespace: clone.hasLoadedNamespace.bind(clone) + }; + return clone; + } + toJSON() { + return { + options: this.options, + store: this.store, + language: this.language, + languages: this.languages, + resolvedLanguage: this.resolvedLanguage + }; + } +} +const instance = I18n.createInstance(); +instance.createInstance = I18n.createInstance; +instance.createInstance; +instance.dir; +instance.init; +instance.loadResources; +instance.reloadResources; +instance.use; +instance.changeLanguage; +instance.getFixedT; +instance.t; +instance.exists; +instance.setDefaultNamespace; +instance.hasLoadedNamespace; +instance.loadNamespaces; +instance.loadLanguages; + +function __variableDynamicImportRuntime0__(path) { + switch (path) { + case './locale/lang.af.js': + return Promise.resolve().then(function () { return lang_af$1; }); + case './locale/lang.ar.js': + return Promise.resolve().then(function () { return lang_ar$1; }); + case './locale/lang.az.js': + return Promise.resolve().then(function () { return lang_az$1; }); + case './locale/lang.be.js': + return Promise.resolve().then(function () { return lang_be$1; }); + case './locale/lang.bg.js': + return Promise.resolve().then(function () { return lang_bg$1; }); + case './locale/lang.ca.js': + return Promise.resolve().then(function () { return lang_ca$1; }); + case './locale/lang.cs.js': + return Promise.resolve().then(function () { return lang_cs$1; }); + case './locale/lang.cy.js': + return Promise.resolve().then(function () { return lang_cy$1; }); + case './locale/lang.da.js': + return Promise.resolve().then(function () { return lang_da$1; }); + case './locale/lang.de.js': + return Promise.resolve().then(function () { return lang_de$1; }); + case './locale/lang.el.js': + return Promise.resolve().then(function () { return lang_el$1; }); + case './locale/lang.en.js': + return Promise.resolve().then(function () { return lang_en$1; }); + case './locale/lang.es.js': + return Promise.resolve().then(function () { return lang_es$1; }); + case './locale/lang.et.js': + return Promise.resolve().then(function () { return lang_et$1; }); + case './locale/lang.fa.js': + return Promise.resolve().then(function () { return lang_fa$1; }); + case './locale/lang.fi.js': + return Promise.resolve().then(function () { return lang_fi$1; }); + case './locale/lang.fr.js': + return Promise.resolve().then(function () { return lang_fr$1; }); + case './locale/lang.fy.js': + return Promise.resolve().then(function () { return lang_fy$1; }); + case './locale/lang.ga.js': + return Promise.resolve().then(function () { return lang_ga$1; }); + case './locale/lang.gl.js': + return Promise.resolve().then(function () { return lang_gl$1; }); + case './locale/lang.he.js': + return Promise.resolve().then(function () { return lang_he$1; }); + case './locale/lang.hi.js': + return Promise.resolve().then(function () { return lang_hi$1; }); + case './locale/lang.hr.js': + return Promise.resolve().then(function () { return lang_hr$1; }); + case './locale/lang.hu.js': + return Promise.resolve().then(function () { return lang_hu$1; }); + case './locale/lang.hy.js': + return Promise.resolve().then(function () { return lang_hy$1; }); + case './locale/lang.id.js': + return Promise.resolve().then(function () { return lang_id$1; }); + case './locale/lang.is.js': + return Promise.resolve().then(function () { return lang_is$1; }); + case './locale/lang.it.js': + return Promise.resolve().then(function () { return lang_it$1; }); + case './locale/lang.ja.js': + return Promise.resolve().then(function () { return lang_ja$1; }); + case './locale/lang.ko.js': + return Promise.resolve().then(function () { return lang_ko$1; }); + case './locale/lang.lt.js': + return Promise.resolve().then(function () { return lang_lt$1; }); + case './locale/lang.lv.js': + return Promise.resolve().then(function () { return lang_lv$1; }); + case './locale/lang.mk.js': + return Promise.resolve().then(function () { return lang_mk$1; }); + case './locale/lang.ms.js': + return Promise.resolve().then(function () { return lang_ms$1; }); + case './locale/lang.mt.js': + return Promise.resolve().then(function () { return lang_mt$1; }); + case './locale/lang.nl.js': + return Promise.resolve().then(function () { return lang_nl$1; }); + case './locale/lang.no.js': + return Promise.resolve().then(function () { return lang_no$1; }); + case './locale/lang.pl.js': + return Promise.resolve().then(function () { return lang_pl$1; }); + case './locale/lang.pt-BR.js': + return Promise.resolve().then(function () { return lang_ptBR$1; }); + case './locale/lang.pt-PT.js': + return Promise.resolve().then(function () { return lang_ptPT$1; }); + case './locale/lang.ro.js': + return Promise.resolve().then(function () { return lang_ro$1; }); + case './locale/lang.ru.js': + return Promise.resolve().then(function () { return lang_ru$1; }); + case './locale/lang.sk.js': + return Promise.resolve().then(function () { return lang_sk$1; }); + case './locale/lang.sl.js': + return Promise.resolve().then(function () { return lang_sl$1; }); + case './locale/lang.sq.js': + return Promise.resolve().then(function () { return lang_sq$1; }); + case './locale/lang.sr.js': + return Promise.resolve().then(function () { return lang_sr$1; }); + case './locale/lang.sv.js': + return Promise.resolve().then(function () { return lang_sv$1; }); + case './locale/lang.sw.js': + return Promise.resolve().then(function () { return lang_sw$1; }); + case './locale/lang.test.js': + return Promise.resolve().then(function () { return lang_test$1; }); + case './locale/lang.th.js': + return Promise.resolve().then(function () { return lang_th$1; }); + case './locale/lang.tl.js': + return Promise.resolve().then(function () { return lang_tl$1; }); + case './locale/lang.tr.js': + return Promise.resolve().then(function () { return lang_tr$1; }); + case './locale/lang.uk.js': + return Promise.resolve().then(function () { return lang_uk$1; }); + case './locale/lang.vi.js': + return Promise.resolve().then(function () { return lang_vi$1; }); + case './locale/lang.yi.js': + return Promise.resolve().then(function () { return lang_yi$1; }); + case './locale/lang.zh-CN.js': + return Promise.resolve().then(function () { return lang_zhCN$1; }); + case './locale/lang.zh-HK.js': + return Promise.resolve().then(function () { return lang_zhHK$1; }); + case './locale/lang.zh-TW.js': + return Promise.resolve().then(function () { return lang_zhTW$1; }); + default: + return new Promise(function (resolve, reject) { + (typeof queueMicrotask === 'function' ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path))); + }); + } +} + +/** + * The string keys of the object are two-letter language codes. + * @tutorial LocaleDocs + * @typedef {PlainObject} module:locale.LocaleStrings + */ +// keyed to an array of objects with "id" and "title" or "textContent" properties +/** + * @typedef {PlainObject} module:locale.LocaleSelectorValue + */ + +let langParam; + +/** +* The "data" property is generally set to an an array of objects with +* "id" and "title" or "textContent" properties. +* @typedef {PlainObject} module:locale.AddLangExtensionLocaleData +* @property {module:locale.LocaleStrings[]} data See {@tutorial LocaleDocs} +*/ + +/** +* @interface module:locale.LocaleEditorInit +*/ +/** + * @function module:locale.LocaleEditorInit#addLangData + * @param {string} langParam + * @returns {module:locale.AddLangExtensionLocaleData} +*/ +/** +* @typedef {PlainObject} module:locale.LangAndData +* @property {string} langParam +* @property {module:locale.LocaleStrings} langData +*/ + +/** + * + * @function module:locale.putLocale + * @param {string} givenParam + * @param {string[]} goodLangs + * @fires module:svgcanvas.SvgCanvas#event:ext_addLangData + * @fires module:svgcanvas.SvgCanvas#event:ext_langReady + * @fires module:svgcanvas.SvgCanvas#event:ext_langChanged + * @returns {Promise} Resolves to result of {@link module:locale.readLang} +*/ + +const putLocale = async function (givenParam, goodLangs) { + if (givenParam) { + langParam = givenParam; + } else if (navigator.userLanguage) { + // Explorer + langParam = navigator.userLanguage; + } else if (navigator.language) { + // FF, Opera, ... + langParam = navigator.language; + } + + // Set to English if language is not in list of good langs + if (!goodLangs.includes(langParam) && langParam !== 'test') { + langParam = 'en'; + } + const module = await __variableDynamicImportRuntime0__(`./locale/lang.${encodeURIComponent(langParam)}.js`); + instance.init({ + lng: langParam, + debug: false, + resources: { + [langParam]: { + translation: module.default + } + } + }); + return { + langParam, + i18next: instance + }; +}; +const t$2 = function (key) { + return instance.t(key); +}; + +/* globals svgEditor */ +const template$j = document.createElement('template'); +template$j.innerHTML = ` + +
+ icon +
+`; +/** + * @class ToolButton + */ +class ToolButton extends HTMLElement { + /** + * @function constructor + */ + constructor() { + super(); + // create the shadowDom and insert the template + this._shadowRoot = this.attachShadow({ + mode: 'open' + }); + this._shadowRoot.append(template$j.content.cloneNode(true)); + // locate the component + this.$div = this._shadowRoot.querySelector('div'); + this.$img = this._shadowRoot.querySelector('img'); + this.imgPath = svgEditor.configObj.curConfig.imgPath; + } + + /** + * @function observedAttributes + * @returns {any} observed + */ + static get observedAttributes() { + return ['title', 'src', 'pressed', 'disabled', 'size', 'style']; + } + + /** + * @function attributeChangedCallback + * @param {string} name + * @param {string} oldValue + * @param {string} newValue + * @returns {void} + */ + attributeChangedCallback(name, oldValue, newValue) { + if (oldValue === newValue) return; + switch (name) { + case 'title': + { + const shortcut = this.getAttribute('shortcut'); + this.$div.setAttribute('title', `${t$2(newValue)} ${shortcut ? `[${t$2(shortcut)}]` : ''}`); + } + break; + case 'style': + this.$div.style = newValue; + break; + case 'src': + if (newValue.indexOf('data:') !== -1) { + this.$img.setAttribute('src', newValue); + } else { + this.$img.setAttribute('src', this.imgPath + '/' + newValue); + } + break; + case 'pressed': + if (newValue === null) { + this.$div.classList.remove('pressed'); + } else { + this.$div.classList.add('pressed'); + } + break; + case 'size': + if (newValue === 'small') { + this.$div.classList.add('small'); + } else { + this.$div.classList.remove('small'); + } + break; + case 'disabled': + if (newValue) { + this.$div.classList.add('disabled'); + } else { + this.$div.classList.remove('disabled'); + } + break; + default: + console.error(`unknown attribute: ${name}`); + break; + } + } + + /** + * @function get + * @returns {any} + */ + get title() { + return this.getAttribute('title'); + } + + /** + * @function set + * @returns {void} + */ + set title(value) { + this.setAttribute('title', value); + } + + /** + * @function get + * @returns {any} + */ + get pressed() { + return this.hasAttribute('pressed'); + } + + /** + * @function set + * @returns {void} + */ + set pressed(value) { + // boolean value => existence = true + if (value) { + this.setAttribute('pressed', 'true'); + } else { + this.removeAttribute('pressed'); + } + } + + /** + * @function get + * @returns {any} + */ + get disabled() { + return this.hasAttribute('disabled'); + } + + /** + * @function set + * @returns {void} + */ + set disabled(value) { + // boolean value => existence = true + if (value) { + this.setAttribute('disabled', 'true'); + } else { + this.removeAttribute('disabled'); + } + } + + /** + * @function get + * @returns {any} + */ + get src() { + return this.getAttribute('src'); + } + + /** + * @function set + * @returns {void} + */ + set src(value) { + this.setAttribute('src', value); + } + + /** + * @function get + * @returns {any} + */ + get size() { + return this.getAttribute('size'); + } + + /** + * @function set + * @returns {void} + */ + set size(value) { + this.setAttribute('size', value); + } + + /** + * @function connectedCallback + * @returns {void} + */ + connectedCallback() { + // capture shortcuts + const shortcut = this.getAttribute('shortcut'); + if (shortcut) { + // register the keydown event + document.addEventListener('keydown', e => { + // only track keyboard shortcuts for the body containing the SVG-Editor + if (e.target.nodeName !== 'BODY') return; + // normalize key + const key = `${e.metaKey ? 'meta+' : ''}${e.ctrlKey ? 'ctrl+' : ''}${e.key.toUpperCase()}`; + if (shortcut !== key) return; + // launch the click event + this.click(); + e.preventDefault(); + }); + } + } +} + +// Register +customElements.define('se-button', ToolButton); + +/* globals svgEditor */ + +/** + * @class FlyingButton + */ +class FlyingButton extends HTMLElement { + /** + * @function constructor + */ + constructor() { + super(); + // create the shadowDom and insert the template + this.imgPath = svgEditor.configObj.curConfig.imgPath; + this.template = this.createTemplate(this.imgPath); + this._shadowRoot = this.attachShadow({ + mode: 'open' + }); + this._shadowRoot.append(this.template.content.cloneNode(true)); + // locate the component + this.$button = this._shadowRoot.querySelector('.menu-button'); + this.$handle = this._shadowRoot.querySelector('.handle'); + this.$overall = this._shadowRoot.querySelector('.overall'); + this.$img = this._shadowRoot.querySelector('img'); + this.$menu = this._shadowRoot.querySelector('.menu'); + // the last element of the div is the slot + // we retrieve all elements added in the slot (i.e. se-buttons) + this.$elements = this.$menu.lastElementChild.assignedElements(); + } + + /** + * @function createTemplate + * @param {string} imgPath + * @returns {any} template + */ + + createTemplate(imgPath) { + const template = document.createElement('template'); + template.innerHTML = ` + + +
+ + +
`; + return template; + } + + /** + * @function observedAttributes + * @returns {any} observed + */ + static get observedAttributes() { + return ['title', 'pressed', 'disabled', 'opened']; + } + + /** + * @function attributeChangedCallback + * @param {string} name + * @param {string} oldValue + * @param {string} newValue + * @returns {void} + */ + attributeChangedCallback(name, oldValue, newValue) { + if (oldValue === newValue) return; + switch (name) { + case 'title': + { + const shortcut = this.getAttribute('shortcut'); + this.$button.setAttribute('title', `${t$2(newValue)} ${shortcut ? `[${t$2(shortcut)}]` : ''}`); + } + break; + case 'pressed': + if (newValue) { + this.$overall.classList.add('pressed'); + } else { + this.$overall.classList.remove('pressed'); + } + break; + case 'opened': + if (newValue) { + this.$menu.classList.add('open'); + } else { + this.$menu.classList.remove('open'); + } + break; + case 'disabled': + if (newValue) { + this.$overall.classList.add('disabled'); + } else { + this.$overall.classList.remove('disabled'); + } + break; + default: + console.error(`unknown attribute: ${name}`); + break; + } + } + + /** + * @function get + * @returns {any} + */ + get title() { + return this.getAttribute('title'); + } + + /** + * @function set + * @returns {void} + */ + set title(value) { + this.setAttribute('title', value); + } + + /** + * @function get + * @returns {any} + */ + get pressed() { + return this.hasAttribute('pressed'); + } + + /** + * @function set + * @returns {void} + */ + set pressed(value) { + // boolean value => existence = true + if (value) { + this.setAttribute('pressed', 'true'); + } else { + this.removeAttribute('pressed', ''); + // close also the menu if open + this.removeAttribute('opened'); + } + } + + /** + * @function get + * @returns {any} + */ + get opened() { + return this.hasAttribute('opened'); + } + + /** + * @function set + * @returns {void} + */ + set opened(value) { + // boolean value => existence = true + if (value) { + this.setAttribute('opened', 'opened'); + } else { + this.removeAttribute('opened'); + } + } + + /** + * @function get + * @returns {any} + */ + get disabled() { + return this.hasAttribute('disabled'); + } + + /** + * @function set + * @returns {void} + */ + set disabled(value) { + // boolean value => existence = true + if (value) { + this.setAttribute('disabled', 'true'); + } else { + this.removeAttribute('disabled', ''); + } + } + + /** + * @function connectedCallback + * @returns {void} + */ + connectedCallback() { + this.activeSlot = this.shadowRoot.querySelector('slot').assignedElements()[0]; + this.$img.setAttribute('src', this.imgPath + '/' + this.activeSlot.getAttribute('src')); + // capture click event on the button to manage the logic + const onClickHandler = ev => { + ev.stopPropagation(); + switch (ev.target.nodeName) { + case 'SE-FLYINGBUTTON': + if (this.pressed) { + this.setAttribute('opened', 'opened'); + } else { + // launch current action + this.activeSlot.click(); + this.setAttribute('pressed', 'pressed'); + } + break; + case 'SE-BUTTON': + // change to the current action + this.$img.setAttribute('src', this.imgPath + '/' + ev.target.getAttribute('src')); + this.activeSlot = ev.target; + this.setAttribute('pressed', 'pressed'); + // and close the menu + this.$menu.classList.remove('open'); + break; + case 'DIV': + // this is a click on the handle so let's open/close the menu. + if (this.opened) { + this.removeAttribute('opened'); + } else { + this.setAttribute('opened', 'opened'); + // In case menu scroll on top or bottom position based popup position set + const rect = this.getBoundingClientRect(); + this.$menu.style.top = rect.top + 'px'; + } + break; + default: + console.error('unkonw nodeName for:', ev.target, ev.target.className); + } + }; + // capture event from slots + svgEditor.$click(this, onClickHandler); + svgEditor.$click(this.$handle, onClickHandler); + } +} + +// Register +customElements.define('se-flyingbutton', FlyingButton); + +/* globals svgEditor */ + +/** + * @class ExplorerButton + */ +class ExplorerButton extends HTMLElement { + /** + * @function constructor + */ + constructor() { + super(); + // create the shadowDom and insert the template + // create the shadowDom and insert the template + this.imgPath = svgEditor.configObj.curConfig.imgPath; + this.template = this.createTemplate(this.imgPath); + this._shadowRoot = this.attachShadow({ + mode: 'open' + }); + this._shadowRoot.append(this.template.content.cloneNode(true)); + // locate the component + this.$button = this._shadowRoot.querySelector('.menu-button'); + this.$overall = this._shadowRoot.querySelector('.overall'); + this.$img = this._shadowRoot.querySelector('.menu-button img'); + this.$menu = this._shadowRoot.querySelector('.menu'); + this.$handle = this._shadowRoot.querySelector('.handle'); + this.$lib = this._shadowRoot.querySelector('.image-lib'); + this.files = []; + this.request = new XMLHttpRequest(); + this.imgPath = svgEditor.configObj.curConfig.imgPath; + } + + /** + * @function createTemplate + * @param {string} imgPath + * @returns {any} template + */ + + createTemplate(imgPath) { + const template = document.createElement('template'); + template.innerHTML = ` + + +
+ +
+ +
+ +
`; + return template; + } + + /** + * @function observedAttributes + * @returns {any} observed + */ + static get observedAttributes() { + return ['title', 'pressed', 'disabled', 'lib', 'src']; + } + + /** + * @function attributeChangedCallback + * @param {string} name + * @param {string} oldValue + * @param {string} newValue + * @returns {void} + */ + async attributeChangedCallback(name, oldValue, newValue) { + if (oldValue === newValue) return; + switch (name) { + case 'title': + { + const shortcut = this.getAttribute('shortcut'); + this.$button.setAttribute('title', `${newValue} [${shortcut}]`); + } + break; + case 'pressed': + if (newValue) { + this.$overall.classList.add('pressed'); + } else { + this.$overall.classList.remove('pressed'); + } + break; + case 'disabled': + if (newValue) { + this.$overall.classList.add('disabled'); + } else { + this.$overall.classList.remove('disabled'); + } + break; + case 'lib': + try { + const response = await fetch(`${newValue}index.json`); + const json = await response.json(); + const { + lib + } = json; + this.$menu.innerHTML = lib.map((menu, i) => ``).join(''); + await this.updateLib(lib[0]); + } catch (error) { + console.error(error); + } + break; + case 'src': + this.$img.setAttribute('src', this.imgPath + '/' + newValue); + break; + default: + console.error(`unknown attribute: ${name}`); + break; + } + } + + /** + * @function get + * @returns {any} + */ + get title() { + return this.getAttribute('title'); + } + + /** + * @function set + * @returns {void} + */ + set title(value) { + this.setAttribute('title', value); + } + + /** + * @function get + * @returns {any} + */ + get pressed() { + return this.hasAttribute('pressed'); + } + + /** + * @function set + * @returns {void} + */ + set pressed(value) { + // boolean value => existence = true + if (value) { + this.setAttribute('pressed', 'true'); + } else { + this.removeAttribute('pressed', ''); + } + } + + /** + * @function get + * @returns {any} + */ + get disabled() { + return this.hasAttribute('disabled'); + } + + /** + * @function set + * @returns {void} + */ + set disabled(value) { + // boolean value => existence = true + if (value) { + this.setAttribute('disabled', 'true'); + } else { + this.removeAttribute('disabled', ''); + } + } + + /** + * @function connectedCallback + * @returns {void} + */ + connectedCallback() { + // capture click event on the button to manage the logic + const onClickHandler = ev => { + ev.stopPropagation(); + switch (ev.target.nodeName) { + case 'SE-EXPLORERBUTTON': + this.$menu.classList.add('open'); + this.$lib.classList.add('open-lib'); + break; + case 'SE-BUTTON': + // change to the current action + this.currentAction = ev.target; + this.$img.setAttribute('src', this.currentAction.getAttribute('src')); + this.dataset.draw = this.data[this.currentAction.dataset.shape]; + this._shadowRoot.querySelectorAll('.image-lib [pressed]').forEach(b => { + b.pressed = false; + }); + this.currentAction.setAttribute('pressed', 'pressed'); + // and close the menu + this.$menu.classList.remove('open'); + this.$lib.classList.remove('open-lib'); + break; + case 'DIV': + if (ev.target.classList[0] === 'handle') { + // this is a click on the handle so let's open/close the menu. + this.$menu.classList.toggle('open'); + this.$lib.classList.toggle('open-lib'); + } else { + this._shadowRoot.querySelectorAll('.menu > .pressed').forEach(b => { + b.classList.remove('pressed'); + }); + ev.target.classList.add('pressed'); + this.updateLib(ev.target.dataset.menu); + } + break; + default: + console.error('unknown nodeName for:', ev.target, ev.target.className); + } + }; + // capture event from slots + svgEditor.$click(this, onClickHandler); + svgEditor.$click(this.$menu, onClickHandler); + svgEditor.$click(this.$lib, onClickHandler); + svgEditor.$click(this.$handle, onClickHandler); + } + + /** + * @function updateLib + * @param {string} lib + * @returns {void} + */ + async updateLib(lib) { + const libDir = this.getAttribute('lib'); + try { + // initialize buttons for all shapes defined for this library + const response = await fetch(`${libDir}${lib}.json`); + const json = await response.json(); + this.data = json.data; + const size = json.size ?? 300; + const fill = json.fill ? '#333' : 'none'; + const off = size * 0.05; + const vb = [-off, -off, size + off * 2, size + off * 2].join(' '); + const stroke = json.fill ? 0 : size / 30; + this.$lib.innerHTML = Object.entries(this.data).map(_ref => { + let [key, path] = _ref; + const encoded = btoa(` + + + `); + return ``; + }).join(''); + } catch (error) { + console.error(`could not read file:${libDir}${lib}.json`, error); + } + } +} + +// Register +customElements.define('se-explorerbutton', ExplorerButton); + +/* globals svgEditor */ +const template$i = document.createElement('template'); +template$i.innerHTML = ` + +
+ icon + +
+
+
+
+
+ +
+
+ +`; +class SeZoom extends HTMLElement { + constructor() { + super(); + this.handleMouseDown = this.handleMouseDown.bind(this); + this.handleMouseUp = this.handleMouseUp.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); + this.initPopup = this.initPopup.bind(this); + this.handleInput = this.handleInput.bind(this); + + // create the shadowDom and insert the template + this._shadowRoot = this.attachShadow({ + mode: 'open' + }); + // locate the component + this._shadowRoot.append(template$i.content.cloneNode(true)); + + // prepare the slot element + this.slotElement = this._shadowRoot.querySelector('slot'); + this.slotElement.addEventListener('slotchange', this.handleOptionsChange.bind(this)); + + // hookup events for the input box + this.inputElement = this._shadowRoot.querySelector('input'); + this.inputElement.addEventListener('click', this.handleClick.bind(this)); + this.inputElement.addEventListener('change', this.handleInput); + this.inputElement.addEventListener('keydown', this.handleKeyDown); + this.clickArea = this._shadowRoot.querySelector('#down'); + this.clickArea.addEventListener('click', this.handleClick.bind(this)); + this.imgPath = svgEditor.configObj.curConfig.imgPath; + this.downImageElement = this.clickArea.querySelector('img'); + this.downImageElement.setAttribute('src', this.imgPath + '/' + this.downImageElement.getAttribute('src')); + + // set src for imageElement + this.imageElement = this._shadowRoot.querySelector('img'); + this.imageElement.setAttribute('src', this.imgPath + '/' + this.getAttribute('src')); + + // hookup events for arrow buttons + this.arrowUp = this._shadowRoot.querySelector('#arrow-up'); + this.arrowUp.addEventListener('click', this.increment.bind(this)); + this.arrowUp.addEventListener('mousedown', e => this.handleMouseDown('up', true)); + this.arrowUp.addEventListener('mouseleave', e => this.handleMouseUp('up')); + this.arrowUp.addEventListener('mouseup', e => this.handleMouseUp('up')); + this.arrowDown = this._shadowRoot.querySelector('#arrow-down'); + this.arrowDown.addEventListener('click', this.decrement.bind(this)); + this.arrowDown.addEventListener('mousedown', e => this.handleMouseDown('down', true)); + this.arrowDown.addEventListener('mouseleave', e => this.handleMouseUp('down')); + this.arrowDown.addEventListener('mouseup', e => this.handleMouseUp('down')); + this.optionsContainer = this._shadowRoot.querySelector('#options-container'); + + // add an event listener to close the popup + document.addEventListener('click', e => this.handleClose(e)); + this.changedTimeout = null; + } + static get observedAttributes() { + return ['value']; + } + + /** + * @function get + * @returns {any} + */ + get value() { + return this.getAttribute('value'); + } + + /** + * @function set + * @returns {void} + */ + set value(value) { + this.setAttribute('value', value); + } + + /** + * @function attributeChangedCallback + * @param {string} name + * @param {string} oldValue + * @param {string} newValue + * @returns {void} + */ + attributeChangedCallback(name, oldValue, newValue) { + if (oldValue === newValue) { + switch (name) { + case 'value': + if (parseInt(this.inputElement.value) !== newValue) { + this.inputElement.value = newValue; + } + break; + } + return; + } + switch (name) { + case 'value': + this.inputElement.value = newValue; + this.dispatchEvent(new CustomEvent('change', { + detail: { + value: newValue + } + })); + break; + } + } + + /** + * @function handleOptionsChange + * @returns {void} + */ + handleOptionsChange() { + if (this.slotElement.assignedElements().length > 0) { + this.options = this.slotElement.assignedElements(); + this.selectedValue = this.options[0].textContent; + this.initPopup(); + this.options.forEach(option => { + option.addEventListener('click', e => this.handleSelect(e)); + }); + } + } + + /** + * @function handleClick + * @returns {void} + */ + handleClick() { + this.optionsContainer.style.display = 'flex'; + this.inputElement.select(); + this.initPopup(); + } + + /** + * @function handleSelect + * @param {Event} e + * @returns {void} + */ + handleSelect(e) { + this.value = e.target.getAttribute('value'); + this.title = e.target.getAttribute('text'); + } + + /** + * @function handleShow + * @returns {void} + * initialises the popup menu position + */ + initPopup() { + const zoomPos = this.getBoundingClientRect(); + const popupPos = this.optionsContainer.getBoundingClientRect(); + const top = zoomPos.top - popupPos.height; + const left = zoomPos.left; + this.optionsContainer.style.position = 'fixed'; + this.optionsContainer.style.top = `${top}px`; + this.optionsContainer.style.left = `${left}px`; + } + + /** + * @function handleClose + * @param {Event} e + * @returns {void} + * Close the popup menu + */ + handleClose(e) { + if (e.target !== this) { + this.optionsContainer.style.display = 'none'; + this.inputElement.blur(); + } + } + + /** + * @function handleInput + * @returns {void} + */ + handleInput() { + if (this.changedTimeout) { + clearTimeout(this.changedTimeout); + } + this.changedTimeout = setTimeout(this.triggerInputChanged.bind(this), 500); + } + + /** + * @function triggerInputChanged + * @returns {void} + */ + triggerInputChanged() { + const newValue = this.inputElement.value; + this.value = newValue; + } + + /** + * @function increment + * @returns {void} + */ + increment() { + this.value = parseInt(this.value) + 10; + } + + /** + * @function decrement + * @returns {void} + */ + decrement() { + if (this.value - 10 <= 0) { + this.value = 10; + } else { + this.value = parseInt(this.value) - 10; + } + } + + /** + * @function handleMouseDown + * @param {string} dir + * @param {boolean} isFirst + * @returns {void} + * Increment/Decrement on mouse held down, if its the first call add a delay before starting + */ + handleMouseDown(dir, isFirst) { + if (dir === 'up') { + this.incrementHold = true; + !isFirst && this.increment(); + setTimeout(() => { + if (this.incrementHold) { + this.handleMouseDown(dir, false); + } + }, isFirst ? 500 : 50); + } else if (dir === 'down') { + this.decrementHold = true; + !isFirst && this.decrement(); + setTimeout(() => { + if (this.decrementHold) { + this.handleMouseDown(dir, false); + } + }, isFirst ? 500 : 50); + } + } + + /** + * @function handleMouseUp + * @param {string} dir + * @returns {void} + */ + handleMouseUp(dir) { + if (dir === 'up') { + this.incrementHold = false; + } else { + this.decrementHold = false; + } + } + + /** + * @function handleKeyDown + * @param {Event} e + * @returns {void} + */ + handleKeyDown(e) { + if (e.key === 'ArrowUp') { + this.increment(); + } else if (e.key === 'ArrowDown') { + this.decrement(); + } + } +} + +// Register +customElements.define('se-zoom', SeZoom); + +/** + * JavaScript template literals for constructing DOM nodes from HTML + * + * @module html + */ + +/** + * A JavaScript template string literal that returns an HTML document fragment. + * + * Example: + * + * const fragment = fragmentFrom.html`Hello, world.` + * + * returns a `DocumentFragment` whose `innerHTML` is `Hello, world.` + * + * This function is called `html` so that it can be easily used with HTML + * syntax-highlighting extensions for various popular code editors. + * + * See also [templateFrom.html](template#html), which returns a similar result but + * as an HTMLTemplateElement. + * + * @param {TemplateStringsArray} strings - the strings passed to the JavaScript template + * literal + * @param {string[]} substitutions - the variable values passed to the + * JavaScript template literal + * @returns {DocumentFragment} + */ +const fragmentFrom = { + html(strings) { + for (var _len = arguments.length, substitutions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + substitutions[_key - 1] = arguments[_key]; + } + return templateFrom.html(strings, ...substitutions).content; + } +}; + +/** + * A JavaScript template string literal that returns an HTML template. + * + * Example: + * + * const myTemplate = templateFrom.html`Hello, world.` + * + * returns an `HTMLTemplateElement` whose `innerHTML` is `Hello, world.` + * + * This function is called `html` so that it can be easily used with HTML + * syntax-highlighting extensions for various popular code editors. + * + * See also [html](html), a helper which returns a similar result but as an + * DocumentFragment. + * + * @param {TemplateStringsArray} strings - the strings passed to the JavaScript template + * literal + * @param {string[]} substitutions - the variable values passed to the + * JavaScript template literal + * @returns {HTMLTemplateElement} + */ +const templateFrom = { + html(strings) { + const template = document.createElement("template"); + for (var _len2 = arguments.length, substitutions = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + substitutions[_key2 - 1] = arguments[_key2]; + } + template.innerHTML = String.raw(strings, ...substitutions); + return template; + } +}; + +/** + * Collection of shared Symbol objects for internal component communication. + * + * The shared `Symbol` objects in this module let mixins and a component + * internally communicate without exposing these internal properties and methods + * in the component's public API. They also help avoid unintentional name + * collisions, as a component developer must specifically import the `internal` + * module and reference one of its symbols. + * + * To use these `Symbol` objects in your own component, include this module and + * then create a property or method whose key is the desired Symbol. E.g., + * [ShadowTemplateMixin](ShadowTemplateMixin) expects a component to define + * a property called [template](#template): + * + * import { template } from 'elix/src/core/internal.js'; + * import { templateFrom } from 'elix/src/core/htmlLiterals.js' + * import ShadowTemplateMixin from 'elix/src/core/ShadowTemplateMixin.js'; + * + * class MyElement extends ShadowTemplateMixin(HTMLElement) { + * [template]() { + * return templateFrom.html`Hello, world.`; + * } + * } + * + * The above use of the internal `template` member lets the mixin find the + * component's template in a way that will not pollute the component's public + * API or interfere with other component logic. For example, if for some reason + * the component wants to define a separate property with the plain string name, + * "template", it can do so without affecting the above property setter. + * + * @module internal + */ + +/** + * Symbol for the default state for this element. + */ +const defaultState$1 = Symbol("defaultState"); + +/** + * Symbol for the `delegatesFocus` property. + * + * [DelegatesFocusMixin](DelegatesFocusMixin) defines this property, returning + * true to indicate that the focus is being delegated, even in browsers that + * don't support that natively. Mixins like [KeyboardMixin](KeyboardMixin) use + * this to accommodate focus delegation. + */ +const delegatesFocus$1 = Symbol("delegatesFocus"); + +/** + * Symbol for the `firstRender` property. + * + * [ReactiveMixin](ReactiveMixin) sets the property to `true` during the + * element's first `render` and `rendered` callback, then `false` in subsequent + * callbacks. + * + * You can inspect this property in your own `rendered` callback handler to do + * work like wiring up events that should only happen once. + */ +const firstRender$1 = Symbol("firstRender"); + +/** + * Symbol for the `focusTarget` property. + * + * [DelegatesFocusMixin](DelegatesFocusMixin) defines this property as either: + * 1) the element itself, in browsers that support native focus delegation or, + * 2) the shadow root's first focusable element. + */ +const focusTarget$1 = Symbol("focusTarget"); + +/** + * Symbol for the `hasDynamicTemplate` property. + * + * If your component class does not always use the same template, define a + * static class property getter with this symbol and have it return `true`. + * This will disable template caching for your component. + */ +const hasDynamicTemplate$1 = Symbol("hasDynamicTemplate"); + +/** + * Symbol for the `ids` property. + * + * [ShadowTemplateMixin](ShadowTemplateMixin) defines a shorthand function + * `internal.ids` that can be used to obtain a reference to a shadow element with + * a given ID. + * + * Example: if component's template contains a shadow element + * `