ソースを参照

feat: b1 实施数据对接

wjc 1 週間 前
コミット
2c85f4af63

+ 10 - 0
babel.config.js

@@ -1,5 +1,15 @@
+/*
+ * @Author: wjc
+ * @Date: 2021-05-31 09:36:11
+ * @LastEditors: wjc
+ * @LastEditTime: 2025-11-26 15:49:51
+ * @Description:
+ */
 module.exports = {
   presets: [
     '@vue/app'
+  ],
+  plugins: [
+    '@babel/plugin-proposal-optional-chaining'
   ]
 }

+ 1 - 0
package.json

@@ -27,6 +27,7 @@
     "vuex": "^3.0.1"
   },
   "devDependencies": {
+    "@babel/plugin-proposal-optional-chaining": "^7.21.0",
     "@vue/cli-plugin-babel": "^3.11.0",
     "@vue/cli-plugin-eslint": "^3.11.0",
     "@vue/cli-service": "^3.11.0",

+ 1 - 8
src/api/hui-jia.js

@@ -2,18 +2,11 @@
  * @Author: wjc
  * @Date: 2025-11-21 10:08:08
  * @LastEditors: wjc
- * @LastEditTime: 2025-11-24 15:43:45
+ * @LastEditTime: 2025-11-26 15:40:49
  * @Description:
  */
 import axios from "../assets/js/api.request"
 export default {
-  getImplementaryData(data) {
-    return axios.request({
-      url: "/platform/bigData/screen/statistics",
-      params: data,
-      method: "get",
-    })
-  },
   /**
    * 部分业务 http://yapi.wisdomcity.com.cn/project/25/interface/api/26531
    */

+ 13 - 1
src/main.js

@@ -2,7 +2,7 @@
  * @Author: WangQiBiao
  * @Date: 2019-09-24 17:50:53
  * @LastEditors: wjc
- * @LastEditTime: 2024-05-11 10:58:33
+ * @LastEditTime: 2025-11-26 15:54:39
  * @Description:
  */
 import Vue from 'vue'
@@ -22,6 +22,18 @@ Vue.use(ElementUI)
 Object.keys(filters).forEach(key => {
   Vue.filter(key, filters[key])
 })
+Vue.filter('safeGet', function (obj, path, defaultValue = '无') {
+  // 分割路径(如 'service.work_template.display_name' 拆分为数组)
+  const keys = path.split('.')
+  let result = obj
+  for (const key of keys) {
+    // 若中间层级为 null/undefined,直接返回默认值
+    if (result === null || result === undefined) return defaultValue
+    result = result[key]
+  }
+  // 最终值为空时返回默认值
+  return result || defaultValue
+})
 
 Vue.use(VueTianditu, {
   v: '4.0',

+ 106 - 112
src/views/hui-jia/b1-screen/index.vue

@@ -59,8 +59,8 @@
           market_vs_month: {
             customer: {
               // 新增企业
-              last_month: 3,
-              this_month: 2,
+              last_month: 0,
+              this_month: 0,
             },
             followup: {
               // 新增企业
@@ -69,18 +69,18 @@
             },
             contact: {
               // 新增联系人
-              last_month: 1,
+              last_month: 0,
               this_month: 0,
             },
             residence: {
               // 新增小区
-              last_month: 3,
-              this_month: 4,
+              last_month: 0,
+              this_month: 0,
             },
             contract: {
               // 新增合同
-              last_month: 5,
-              this_month: 3,
+              last_month: 0,
+              this_month: 0,
             },
             household: {
               // 新增户数
@@ -89,30 +89,30 @@
             },
           }, // 市场拓展数据
           summary: {
-            cities: 35, // 城市总数
-            customers: 270, // 企业总数
-            contracts: 349, // 合同总数
-            perform_times: 815, // 履约次数
-            service_time: 163990350, // 服务时长
-            residences: 806, // 小区总数
-            contracted_households: 473652, // 签约户数
-            actual_households: 459667, // 实施户数
+            cities: 0, // 城市总数
+            customers: 0, // 企业总数
+            contracts: 0, // 合同总数
+            perform_times: 0, // 履约次数
+            service_time: 0, // 服务时长
+            residences: 0, // 小区总数
+            contracted_households: 0, // 签约户数
+            actual_households: 0, // 实施户数
           }, // 实施服务,汇总
           year_summary: {
-            cities: 14, // 履约城市
-            customers: 35, // 服务企业
-            residences: 71, // 服务小区
-            contracts: 44, // 合同份数
-            contracted_households: "24107", // 签约户数
-            actual_households: "22808", // 实施户数
+            cities: 0, // 履约城市
+            customers: 0, // 服务企业
+            residences: 0, // 服务小区
+            contracts: 0, // 合同份数
+            contracted_households: "0", // 签约户数
+            actual_households: "0", // 实施户数
           },
           service_ing: {
             // 实施服务,进行中
-            cities: 7,
-            customers: 11,
-            contracts: 11,
-            residences: 9,
-            contracted_households: "3040",
+            cities: 0,
+            customers: 0,
+            contracts: 0,
+            residences: 0,
+            contracted_households: "0",
             plan: 0,
           },
           service_last_month: {
@@ -125,15 +125,14 @@
             actual_households: 0,
           },
         },
-        implementationData: {
-          ing: {},
-          nowYear: {},
-          total: {},
-        },
+        serviceData: {},
       }
     },
-    computed: {
-      serviceData() {
+    mounted() {
+      this.getData()
+    },
+    methods: {
+      getServiceData() {
         // 图表字段顺序
         const properties = [
           "contracted_households",
@@ -149,20 +148,15 @@
             (key) => this.state.service_last_month[key]
           ),
         }
-
-        return result
+        console.log("----1231-3", result)
+        this.serviceData = result
       },
-    },
-    mounted() {
-      huiJiaApi.getImplementaryData().then((res) => {
-        this.implementationData = res.data.data
-      })
-    },
-    methods: {
       getData() {
         huiJiaApi.getScreenData().then((res) => {
+          console.log("大屏数据----", res.data.data)
           if (res && res.data) {
-            console.log("大屏数据----", res)
+            this.state = res.data.data
+            this.getServiceData()
           }
         })
       },
@@ -171,84 +165,84 @@
 </script>
 
 <style lang="scss" scoped>
-    @import "@/assets/css/theme.scss";
+  @import "@/assets/css/theme.scss";
 
-    $gap-padding: halfW(8);
-    .b1-screen {
-      height: 100vh;
-      width: 100vw;
-      background: var(--page-bg);
-      .logo {
-        text-align: right;
-        padding: halfH(10) 0;
-        .logo-img {
-          height: halfH(64);
-        }
+  $gap-padding: halfW(8);
+  .b1-screen {
+    height: 100vh;
+    width: 100vw;
+    background: var(--page-bg);
+    .logo {
+      text-align: right;
+      padding: halfH(10) 0;
+      .logo-img {
+        height: halfH(64);
       }
     }
-    .b1-screen-content {
-      height: calc(100% - halfH(64) - halfH(28));
-      width: 100%;
+  }
+  .b1-screen-content {
+    height: calc(100% - halfH(64) - halfH(28));
+    width: 100%;
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: center;
+    align-items: center;
+    gap: halfW(16);
+    .item-1 {
+      width: calc(25% - $gap-padding - $gap-padding);
+      height: calc(64% - $gap-padding - $gap-padding);
+    }
+    .middle-wrap {
+      width: calc(
+        50% - $gap-padding - $gap-padding - $gap-padding - $gap-padding
+      );
+      height: calc(64% - $gap-padding - $gap-padding);
       display: flex;
       flex-wrap: wrap;
-      justify-content: center;
-      align-items: center;
       gap: halfW(16);
-      .item-1 {
-        width: calc(25% - $gap-padding - $gap-padding);
-        height: calc(64% - $gap-padding - $gap-padding);
+      justify-content: flex-start;
+      align-items: center;
+      .item-2 {
+        flex: 0 0 100%;
+        width: 100%;
+        height: calc(35% - $gap-padding);
       }
-      .middle-wrap {
-        width: calc(
-          50% - $gap-padding - $gap-padding - $gap-padding - $gap-padding
-        );
-        height: calc(64% - $gap-padding - $gap-padding);
-        display: flex;
-        flex-wrap: wrap;
-        gap: halfW(16);
-        justify-content: flex-start;
-        align-items: center;
-        .item-2 {
-          flex: 0 0 100%;
-          width: 100%;
-          height: calc(35% - $gap-padding);
-        }
-        .item-3 {
-          width: calc(50% - $gap-padding);
-          height: calc(65% - $gap-padding);
-        }
-        .item-4 {
-          width: calc(50% - $gap-padding);
-          height: calc(65% - $gap-padding);
-        }
+      .item-3 {
+        width: calc(50% - $gap-padding);
+        height: calc(65% - $gap-padding);
       }
-      .right-wrap {
-        display: flex;
-        flex-direction: column;
-        width: calc(25% - $gap-padding - $gap-padding);
-        height: calc(64% - $gap-padding);
-        gap: calc($gap-padding * 2);
-        .total-container {
-          height: calc(50% - $gap-padding);
-        }
-        .market-container {
-          height: calc(50% - $gap-padding);
-        }
+      .item-4 {
+        width: calc(50% - $gap-padding);
+        height: calc(65% - $gap-padding);
       }
-      .bottom-wrap {
-        display: flex;
-        justify-content: space-around;
-        gap: halfW(16);
-        width: calc(
-          100% - $gap-padding - $gap-padding - $gap-padding - $gap-padding
-        );
-        height: calc(36% - $gap-padding);
-        .now-year-container {
-          width: 50%;
-        }
-        .implementing-container {
-          width: 50%;
-        }
+    }
+    .right-wrap {
+      display: flex;
+      flex-direction: column;
+      width: calc(25% - $gap-padding - $gap-padding);
+      height: calc(64% - $gap-padding);
+      gap: calc($gap-padding * 2);
+      .total-container {
+        height: calc(50% - $gap-padding);
+      }
+      .market-container {
+        height: calc(50% - $gap-padding);
+      }
+    }
+    .bottom-wrap {
+      display: flex;
+      justify-content: space-around;
+      gap: halfW(16);
+      width: calc(
+        100% - $gap-padding - $gap-padding - $gap-padding - $gap-padding
+      );
+      height: calc(36% - $gap-padding);
+      .now-year-container {
+        width: 50%;
+      }
+      .implementing-container {
+        width: 50%;
       }
     }
+  }
 </style>

+ 78 - 45
src/views/hui-jia/components/implementary/ing.vue

@@ -15,34 +15,52 @@
         class="implementing-item"
         :class="{ 'even-item': index % 2 === 1 }"
       >
-        <div class="item-content">
-          <div class="item-date">{{ dayjs(item.created_at).format("YYYY-MM-DD") }}</div>
-          <div class="item-city">{{ item.residence.location.region_name }}</div>
-          <div class="project-info">
-            <div class="project-name">{{ item.residence.residence_name }}</div>
-            <div class="company-name">{{ item.service.customer.customer_name }}</div>
-          </div>
-          <div class="project-stats">
-            <div class="stat-item">
-              <span class="stat-value">{{ item.householdCount }}</span>
-              <span class="stat-label">户</span>
+        <el-row class="item-content">
+          <el-col :span="3" class="item-date">{{
+            dayjsObj(item.created_at)
+          }}</el-col>
+          <el-col :span="3" class="item-city">
+            {{ item | safeGet("residence.location.region_name", "-") }}
+          </el-col>
+          <el-col :span="7" class="project-info">
+            <div class="project-name">
+              {{ item | safeGet("residence.residence_name", "-") }}
             </div>
-            <div class="stat-item">
-              <span class="stat-value">{{ item.service.liable_person.real_name }}</span>
+            <div class="company-name">
+              {{ item | safeGet("service.customer.customer_name", "-") }}
             </div>
-            <div class="stat-item">
-              <div class="progress-wrapper">
-                <span class="progress-text">{{ item.service.perform_ratio }}%</span>
-              </div>
-            </div>
-            <div class="stat-item service-item">
-              <span class="service-content">{{ item.service.work_template.display_name }}</span>
-            </div>
-            <div class="stat-item">
-              <span class="period">{{ item.updated_at }}</span>
-            </div>
-          </div>
-        </div>
+          </el-col>
+          <el-col :span="11" class="project-stats">
+            <el-row class="project-row">
+              <el-col :span="3" class="stat-item" style="text-align: right">
+                <span class="stat-value">{{
+                  item | safeGet("residence_contracted_households", "-")
+                }}</span>
+                <span class="stat-label">户</span>
+              </el-col>
+              <el-col :span="4" class="stat-item">
+                <span class="stat-value">{{
+                  item | safeGet("service.liable_person.real_name", "-")
+                }}</span>
+              </el-col>
+              <el-col :span="3" class="stat-item">
+                <div class="progress-wrapper">
+                  <span class="progress-text"
+                    >{{ item | safeGet("service.perform_ratio", "-") }}%</span
+                  >
+                </div>
+              </el-col>
+              <el-col :span="10" class="stat-item service-item">
+                <span class="service-content">{{
+                  item | safeGet("service.work_template.display_name", "-")
+                }}</span>
+              </el-col>
+              <el-col :span="4" class="stat-item">
+                <span class="period">{{ item.updated_at }}</span>
+              </el-col>
+            </el-row>
+          </el-col>
+        </el-row>
       </div>
     </vueSeamless>
   </div>
@@ -60,13 +78,12 @@
     },
     props: {
       data: {
-        type: Object,
-        default: () => ([]),
+        type: Array,
+        default: () => [],
       },
     },
     data() {
-      return {
-      }
+      return {}
     },
     computed: {
       ...mapState(["entCode", "communityId"]),
@@ -77,6 +94,9 @@
       },
     },
     methods: {
+      dayjsObj(date) {
+        return dayjs(date).format("YYYY-MM-DD")
+      },
     },
   }
 </script>
@@ -93,7 +113,7 @@
 
   .implementing-title {
     background: var(--title-bg);
-    font-size: halfW(16);
+    font-size: halfW(14);
     color: var(--title-primary);
     padding: halfH(4) halfW(10);
     border-radius: halfW(4);
@@ -124,50 +144,57 @@
     display: flex;
     justify-content: space-between;
     align-items: center;
-    gap: halfW(16);
+    gap: halfW(10);
     .item-date {
       color: var(--title-secondary);
       font-size: halfW(14);
-      margin-right: halfW(16);
     }
 
     .item-city {
       color: var(--title-primary);
       font-size: halfW(14);
       font-weight: 500;
-      padding: halfH(2) halfW(8);
+      width: halfW(80);
+      padding: halfH(2) 0px;
       border-radius: halfW(4);
     }
 
     .project-info {
-      flex: 1;
-      min-width: halfW(200);
-      margin-right: halfW(20);
+      flex: 1 1 0%;
+      text-align: left;
 
       .project-name {
         flex: 0 0 1;
         color: var(--title-primary);
         font-size: halfW(14);
-        margin-bottom: halfH(4);
+        margin-bottom: halfH(8);
         font-weight: 400;
       }
 
       .company-name {
         color: var(--title-secondary);
         font-size: halfW(14);
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
       }
     }
 
     .project-stats {
-      display: flex;
-      align-items: center;
-      flex-wrap: wrap;
-      gap: halfW(20);
+      .project-row {
+        display: flex;
+        align-items: center;
+        flex-wrap: nowrap;
+        gap: halfW(10);
+      }
     }
 
     .stat-item {
+      // flex: 1 1 0%;
       display: flex;
       align-items: center;
+      text-align: left;
+      // width: halfW(50);
       &:first-child {
         .stat-value {
           color: var(--primary);
@@ -175,7 +202,7 @@
       }
       .stat-value {
         color: #fff;
-        font-size: halfW(16);
+        font-size: halfW(14);
         font-weight: 500;
         margin-right: halfW(4);
       }
@@ -193,7 +220,7 @@
           color: #40d9ac;
           font-size: halfW(14);
           font-weight: 500;
-          min-width: halfW(35);
+          width: halfW(35);
         }
       }
 
@@ -205,10 +232,16 @@
       .period {
         color: #a0b3d6;
         font-size: halfW(14);
+        text-align: right;
       }
     }
     .service-item {
-      flex: 1;
+      min-width: halfW(100);
+      .service-content {
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+      }
     }
   }
 </style>

+ 10 - 4
src/views/hui-jia/components/implementary/now-year.vue

@@ -10,7 +10,6 @@
 
 <script>
   import { mapState } from "vuex"
-  import { api } from "@/api"
   import * as echarts from "echarts"
 
   export default {
@@ -32,15 +31,22 @@
             "服务企业",
             "履约城市",
           ],
-          ongoing: [999, 88888, 88888, 88888, 88888], // 进行中
-          lastMonthCompleted: [88888, 88888, 88888, 88888, 88888], // 上月完成
-          yearTotal: [88888, 88888, 888888, 88888, 88888], // 今年累计
         },
       }
     },
     computed: {
       ...mapState(["entCode", "communityId"]),
     },
+    watch: {
+      data: {
+        handler(newVal, oldVal) {
+          if (newVal) {
+            this.initChart()
+          }
+        },
+        deep: true,
+      },
+    },
     mounted() {
       this.init()
       window.addEventListener("resize", this.handleResize)

+ 127 - 0
yarn.lock

@@ -18,6 +18,15 @@
     "@babel/highlight" "^7.24.2"
     picocolors "^1.0.0"
 
+"@babel/code-frame@^7.27.1":
+  version "7.27.1"
+  resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be"
+  integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.27.1"
+    js-tokens "^4.0.0"
+    picocolors "^1.1.1"
+
 "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5":
   version "7.24.4"
   resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
@@ -54,6 +63,17 @@
     "@jridgewell/trace-mapping" "^0.3.25"
     jsesc "^2.5.1"
 
+"@babel/generator@^7.28.5":
+  version "7.28.5"
+  resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298"
+  integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==
+  dependencies:
+    "@babel/parser" "^7.28.5"
+    "@babel/types" "^7.28.5"
+    "@jridgewell/gen-mapping" "^0.3.12"
+    "@jridgewell/trace-mapping" "^0.3.28"
+    jsesc "^3.0.2"
+
 "@babel/helper-annotate-as-pure@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
@@ -127,6 +147,11 @@
     "@babel/template" "^7.22.15"
     "@babel/types" "^7.23.0"
 
+"@babel/helper-globals@^7.28.0":
+  version "7.28.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674"
+  integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==
+
 "@babel/helper-hoist-variables@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
@@ -196,6 +221,14 @@
   dependencies:
     "@babel/types" "^7.24.5"
 
+"@babel/helper-skip-transparent-expression-wrappers@^7.20.0":
+  version "7.27.1"
+  resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56"
+  integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==
+  dependencies:
+    "@babel/traverse" "^7.27.1"
+    "@babel/types" "^7.27.1"
+
 "@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
@@ -215,11 +248,21 @@
   resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e"
   integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
 
+"@babel/helper-string-parser@^7.27.1":
+  version "7.27.1"
+  resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
+  integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
+
 "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5":
   version "7.24.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62"
   integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==
 
+"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5":
+  version "7.28.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4"
+  integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==
+
 "@babel/helper-validator-option@^7.23.5":
   version "7.23.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
@@ -258,6 +301,13 @@
   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790"
   integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==
 
+"@babel/parser@^7.27.2", "@babel/parser@^7.28.5":
+  version "7.28.5"
+  resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08"
+  integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==
+  dependencies:
+    "@babel/types" "^7.28.5"
+
 "@babel/plugin-proposal-async-generator-functions@^7.2.0":
   version "7.20.7"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326"
@@ -312,6 +362,15 @@
     "@babel/helper-plugin-utils" "^7.18.6"
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
 
+"@babel/plugin-proposal-optional-chaining@^7.21.0":
+  version "7.21.0"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea"
+  integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.20.2"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
 "@babel/plugin-proposal-unicode-property-regex@^7.2.0":
   version "7.18.6"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e"
@@ -369,6 +428,13 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+  integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
 "@babel/plugin-transform-arrow-functions@^7.2.0":
   version "7.24.1"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27"
@@ -682,6 +748,15 @@
     "@babel/parser" "^7.24.0"
     "@babel/types" "^7.24.0"
 
+"@babel/template@^7.27.2":
+  version "7.27.2"
+  resolved "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d"
+  integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==
+  dependencies:
+    "@babel/code-frame" "^7.27.1"
+    "@babel/parser" "^7.27.2"
+    "@babel/types" "^7.27.1"
+
 "@babel/traverse@^7.24.5", "@babel/traverse@^7.7.0":
   version "7.24.5"
   resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8"
@@ -698,6 +773,19 @@
     debug "^4.3.1"
     globals "^11.1.0"
 
+"@babel/traverse@^7.27.1":
+  version "7.28.5"
+  resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b"
+  integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==
+  dependencies:
+    "@babel/code-frame" "^7.27.1"
+    "@babel/generator" "^7.28.5"
+    "@babel/helper-globals" "^7.28.0"
+    "@babel/parser" "^7.28.5"
+    "@babel/template" "^7.27.2"
+    "@babel/types" "^7.28.5"
+    debug "^4.3.1"
+
 "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.7.0":
   version "7.24.5"
   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7"
@@ -707,6 +795,14 @@
     "@babel/helper-validator-identifier" "^7.24.5"
     to-fast-properties "^2.0.0"
 
+"@babel/types@^7.27.1", "@babel/types@^7.28.5":
+  version "7.28.5"
+  resolved "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b"
+  integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==
+  dependencies:
+    "@babel/helper-string-parser" "^7.27.1"
+    "@babel/helper-validator-identifier" "^7.28.5"
+
 "@hapi/address@2.x.x":
   version "2.1.4"
   resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
@@ -760,6 +856,14 @@
     wrap-ansi "^8.1.0"
     wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
 
+"@jridgewell/gen-mapping@^0.3.12":
+  version "0.3.13"
+  resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f"
+  integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
+  dependencies:
+    "@jridgewell/sourcemap-codec" "^1.5.0"
+    "@jridgewell/trace-mapping" "^0.3.24"
+
 "@jridgewell/gen-mapping@^0.3.5":
   version "0.3.5"
   resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
@@ -784,6 +888,11 @@
   resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
   integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
 
+"@jridgewell/sourcemap-codec@^1.5.0":
+  version "1.5.5"
+  resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba"
+  integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
+
 "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
   version "0.3.25"
   resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
@@ -792,6 +901,14 @@
     "@jridgewell/resolve-uri" "^3.1.0"
     "@jridgewell/sourcemap-codec" "^1.4.14"
 
+"@jridgewell/trace-mapping@^0.3.28":
+  version "0.3.31"
+  resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0"
+  integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.1.0"
+    "@jridgewell/sourcemap-codec" "^1.4.14"
+
 "@mrmlnc/readdir-enhanced@^2.2.1":
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
@@ -5713,6 +5830,11 @@ jsesc@^2.5.1:
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
   integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
 
+jsesc@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d"
+  integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
+
 jsesc@~0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
@@ -6959,6 +7081,11 @@ picocolors@^1.0.0:
   resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
   integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
 
+picocolors@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+  integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
 picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
   version "2.3.1"
   resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"