diff --git a/package-lock.json b/package-lock.json index a2b5975a1..ef1732738 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,34 +7,32 @@ "": { "name": "code-for-ibmi", "version": "3.0.14-dev.0", - "hasInstallScript": true, "license": "MIT", "dependencies": { "@ibm/ibmi-eventf-parser": "2.0.2", - "@ibm/mapepire-js": "0.6.1", + "@ibm/mapepire-js": "1.0.1", "@vscode-elements/elements": "2.5.1", "@vscode/codicons": "0.0.45", - "adm-zip": "0.5.16", + "adm-zip": "0.6.1", "crc-32": "https://cdn.sheetjs.com/crc-32-latest/crc-32-latest.tgz", - "csv": "6.4.1", "escape-string-regexp": "5.0.0", "ignore": "7.0.5", "node-ssh": "13.2.1", - "tar": "^7.5.13", - "tmp": "0.2.6", + "tar": "7.5.22", + "tmp": "0.2.7", "vscode-diff": "3.0.1" }, "devDependencies": { - "@octokit/rest": "22.0.1", "@types/adm-zip": "0.5.7", "@types/node": "22.19.7", "@types/ssh2": "^1.15.5", "@types/tar": "6.1.13", "@types/tmp": "0.2.5", "@types/vscode": "^1.90.0", + "@types/ws": "^8.18.2", "@vscode/vsce": "^3.9.1", - "esbuild": "^0.27.0", - "esbuild-loader": "^4.4.2", + "esbuild": "0.28.2", + "esbuild-loader": "4.5.0", "eslint": "^8.57.1", "ssh2-streams": "^0.4.10", "ts-loader": "^9.3.1", @@ -306,9 +304,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ "ppc64" ], @@ -323,9 +321,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ "arm" ], @@ -340,9 +338,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" ], @@ -357,9 +355,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ "x64" ], @@ -374,9 +372,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ "arm64" ], @@ -391,9 +389,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" ], @@ -408,9 +406,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], @@ -425,9 +423,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], @@ -442,9 +440,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", "cpu": [ "arm" ], @@ -459,9 +457,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], @@ -476,9 +474,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ "ia32" ], @@ -493,9 +491,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ "loong64" ], @@ -510,9 +508,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ "mips64el" ], @@ -527,9 +525,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" ], @@ -544,9 +542,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" ], @@ -561,9 +559,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" ], @@ -578,9 +576,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], @@ -595,9 +593,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], @@ -612,9 +610,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], @@ -629,9 +627,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ "arm64" ], @@ -646,9 +644,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], @@ -663,9 +661,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ "arm64" ], @@ -680,9 +678,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" ], @@ -697,9 +695,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], @@ -714,9 +712,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ "ia32" ], @@ -731,9 +729,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -892,12 +890,12 @@ } }, "node_modules/@ibm/mapepire-js": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@ibm/mapepire-js/-/mapepire-js-0.6.1.tgz", - "integrity": "sha512-LWJWNpRY3qqb9aMBpK8IAD5eU3wqMxBc/oBv/Mww1A1E8ekddnY5AYQihyx5Zq5HcDJWT32J1H0vh7sR7lrRmA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@ibm/mapepire-js/-/mapepire-js-1.0.1.tgz", + "integrity": "sha512-LJu1vULBR3f2FYfmeLrjpqu4HHCpirYEf87oEy7ZjN4/Fa8SLuRIJTr4/9h4tvS80NDgTVf9ojOyr87eI2XJyQ==", "license": "Apache-2.0", "dependencies": { - "ws": "^8.16.0" + "ws": "^8.21.0" }, "bin": { "so": "dist/index.js" @@ -1065,173 +1063,6 @@ "node": ">= 8" } }, - "node_modules/@octokit/auth-token": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", - "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", - "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^6.0.0", - "@octokit/graphql": "^9.0.3", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "before-after-hook": "^4.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/endpoint": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", - "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/graphql": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", - "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "27.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", - "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", - "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz", - "integrity": "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", - "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/request": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.10.tgz", - "integrity": "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^11.0.3", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "content-type": "^2.0.0", - "json-with-bigint": "^3.5.3", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/request-error": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", - "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/rest": { - "version": "22.0.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.1.tgz", - "integrity": "sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/core": "^7.0.6", - "@octokit/plugin-paginate-rest": "^14.0.0", - "@octokit/plugin-request-log": "^6.0.0", - "@octokit/plugin-rest-endpoint-methods": "^17.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", - "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^27.0.0" - } - }, "node_modules/@oxc-project/types": { "version": "0.133.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", @@ -1953,6 +1784,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typespec/ts-http-runtime": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.5.tgz", @@ -1976,16 +1817,16 @@ "license": "ISC" }, "node_modules/@vitest/expect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", - "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", + "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -1994,13 +1835,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", - "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", + "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.8", + "@vitest/spy": "4.1.11", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -2021,9 +1862,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", - "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", + "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -2034,13 +1875,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", - "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", + "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.8", + "@vitest/utils": "4.1.11", "pathe": "^2.0.3" }, "funding": { @@ -2048,14 +1889,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", - "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", + "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/pretty-format": "4.1.11", + "@vitest/utils": "4.1.11", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -2064,9 +1905,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", - "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", + "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", "dev": true, "license": "MIT", "funding": { @@ -2074,13 +1915,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", - "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", + "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.8", + "@vitest/pretty-format": "4.1.11", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -2550,12 +2391,12 @@ } }, "node_modules/adm-zip": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.6.1.tgz", + "integrity": "sha512-Xwrja8nx9e5o2N1my4DsKCeKpdrnACyr1wtbPxBDgGzKzKyE9kRtBFA8mWldI+RVlD7CBZNWY/wQ2+ydwOR6kQ==", "license": "MIT", "engines": { - "node": ">=12.0" + "node": ">=14.0" } }, "node_modules/agent-base": { @@ -2745,9 +2586,9 @@ "optional": true }, "node_modules/baseline-browser-mapping": { - "version": "2.10.33", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", - "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==", + "version": "2.11.26", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.26.tgz", + "integrity": "sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2766,13 +2607,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/before-after-hook": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", - "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -2827,9 +2661,9 @@ "license": "BSD-2-Clause" }, "node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -2851,9 +2685,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.1.tgz", + "integrity": "sha512-AUdjuRyCNGUYtqpqfTmWyM4fXay8yIQhmLnvYe/THMGfT9B/34X7xQd3ifKxwyNPPpowVBjLb+64BN9Rn1mizw==", "dev": true, "funding": [ { @@ -2871,11 +2705,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" + "baseline-browser-mapping": "^2.11.25", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.438", + "node-releases": "^2.0.57", + "update-browserslist-db": "^1.3.3" }, "bin": { "browserslist": "cli.js" @@ -3001,9 +2835,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001793", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", - "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "version": "1.0.30001812", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001812.tgz", + "integrity": "sha512-qN+QNNBr93TCmFrmte0bBCjSDMuRvt78VlHT99qIGPszm4QsqCX8lnyWUFkHi8B7ZBAPq8SH+UqyXNy/odMdng==", "dev": true, "funding": [ { @@ -3193,20 +3027,6 @@ "dev": true, "license": "MIT" }, - "node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3285,39 +3105,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/csv": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/csv/-/csv-6.4.1.tgz", - "integrity": "sha512-ajGosmTGnTwYyGl8STqZDu7R6LkDf3xL39XiOmliV/GufQeVUxHzTKIm4NOBCwmEuujK7B6isxs4Uqt9GcRCvA==", - "license": "MIT", - "dependencies": { - "csv-generate": "^4.5.0", - "csv-parse": "^6.1.0", - "csv-stringify": "^6.6.0", - "stream-transform": "^3.4.0" - }, - "engines": { - "node": ">= 0.1.90" - } - }, - "node_modules/csv-generate": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.5.1.tgz", - "integrity": "sha512-nWVtFBfyK+YX1fHtKkMqzULc6sH5ise6baD64SmYTq3GEDSErVZ5xzyMa0hNP/a9PGJTTTyQTU69xpjcuCx2IA==", - "license": "MIT" - }, - "node_modules/csv-parse": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-6.2.1.tgz", - "integrity": "sha512-LRLMV+UCyfMokp8Wb411duBf1gaBKJfOfBWU9eHMJ+b+cJYZsNu3AFmjJf3+yPGd59Exz1TsMjaSFyxnYB9+IQ==", - "license": "MIT" - }, - "node_modules/csv-stringify": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.7.0.tgz", - "integrity": "sha512-UdtziYp5HuTz7e5j8Nvq+a/3HQo+2/aJZ9xntNTpmRRIg/3YYqDVgiS9fvAhtNbnyfbv2ZBe0bqCHqzhE7FqWQ==", - "license": "MIT" - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -3549,9 +3336,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.366", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.366.tgz", - "integrity": "sha512-OlRuhb688YTCzzU3gXPLn6nGyd+F+53INE1qaKKlu6kETErE8FYsyDh0XqXEU+uBRn0MpCzz2vfNwORhkap8qg==", + "version": "1.5.439", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.439.tgz", + "integrity": "sha512-qu6QIPXhsb+CRcAiTMNjR4A1y/7tCYKkKjr5CZXRVih6qkDf79peZ2BpEU3qoDBNCRrcy3Mra3X9nG5oruuA7Q==", "dev": true, "license": "ISC" }, @@ -3707,9 +3494,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3720,42 +3507,42 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" } }, "node_modules/esbuild-loader": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.4.3.tgz", - "integrity": "sha512-Wpui03EzqC151xFteKlgJQhbyZl5CgnBpUHXVuao02nItULlkaTeiLdEMPTmR2zdwpEBWkXVNoT5dDOYJluUzg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.5.0.tgz", + "integrity": "sha512-rVYe97IN1+VoealVHQ3STEPbfTm+vvPk7AZPrL53Pt6JUGBhHTnIqyaow7EveMFlmQ2A1bLp7q19sP4PppaCDQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.27.1", + "esbuild": "^0.28.1", "get-tsconfig": "^4.10.1", "loader-utils": "^2.0.4", "webpack-sources": "^3.3.4" @@ -4103,9 +3890,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", "dev": true, "funding": [ { @@ -4232,17 +4019,17 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -4419,16 +4206,16 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/glob/node_modules/minimatch": { @@ -5023,9 +4810,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "dev": true, "funding": [ { @@ -5066,13 +4853,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-with-bigint": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", - "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", - "dev": true, - "license": "MIT" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -5471,9 +5251,9 @@ } }, "node_modules/linkify-it": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", - "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", "dev": true, "funding": [ { @@ -5684,9 +5464,9 @@ } }, "node_modules/markdown-it": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", - "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", + "version": "14.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.2.tgz", + "integrity": "sha512-sHHjZ5fJKlgrG4qns2YwVcdNep35h5fERrfkD2YNsb9UFk0UIHarbiTaHKVMlPuWAoiilyK8Fv/jAm11slsY7Q==", "dev": true, "funding": [ { @@ -5701,8 +5481,8 @@ "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.1", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" @@ -5894,9 +5674,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", "dev": true, "funding": [ { @@ -5957,9 +5737,9 @@ "optional": true }, "node_modules/node-releases": { - "version": "2.0.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", - "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "version": "2.0.57", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.57.tgz", + "integrity": "sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==", "dev": true, "license": "MIT", "engines": { @@ -6505,9 +6285,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", "dev": true, "funding": [ { @@ -6525,7 +6305,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -6605,13 +6385,14 @@ } }, "node_modules/qs": { - "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz", + "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -7122,15 +6903,15 @@ "license": "MIT" }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -7419,12 +7200,6 @@ "dev": true, "license": "MIT" }, - "node_modules/stream-transform": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.4.1.tgz", - "integrity": "sha512-4P7GsGr95QaRsN09ws40kVdaR6VAeeJtprKVQPOnRp9rOuuW8kzONeYbhikCrbg2RSsHqfIJOnAf+RMNZcKOFQ==", - "license": "MIT" - }, "node_modules/streamsearch": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", @@ -7620,9 +7395,9 @@ } }, "node_modules/tar": { - "version": "7.5.16", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", - "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -7886,9 +7661,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", "dev": true, "license": "MIT", "engines": { @@ -7896,9 +7671,9 @@ } }, "node_modules/tmp": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.6.tgz", - "integrity": "sha512-5sJPdPjfI5Kx+qbrDesxkglRBxW//g7hCsqspEjwkewGvBMGIKMOTKzLt1hFVJzyadba3lDUN20O9qhvbQUSTA==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", "license": "MIT", "engines": { "node": ">=14.14" @@ -8048,9 +7823,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.0.tgz", - "integrity": "sha512-+t2Z/GwkZQDtu00813aP66ygViGtPHKhhoFZpQKpKrE+9jIgES+Zw+mFNaDWOVRKiuJjuqKHzD3B1sfGg8+ZOQ==", + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.0.tgz", + "integrity": "sha512-dkrQXeHSaoamnItlYbmzG0wFYrM0ZwDxCIg0A7aKjTyyhh9svRzCNFEzV+Vm05/yehjCzjDZ31KXfGEjYSztDQ==", "dev": true, "license": "MIT", "engines": { @@ -8077,13 +7852,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/universal-user-agent": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", - "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", - "dev": true, - "license": "ISC" - }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -8095,9 +7863,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", "dev": true, "funding": [ { @@ -8266,19 +8034,19 @@ } }, "node_modules/vitest": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", - "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", + "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.8", - "@vitest/mocker": "4.1.8", - "@vitest/pretty-format": "4.1.8", - "@vitest/runner": "4.1.8", - "@vitest/snapshot": "4.1.8", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/expect": "4.1.11", + "@vitest/mocker": "4.1.11", + "@vitest/pretty-format": "4.1.11", + "@vitest/runner": "4.1.11", + "@vitest/snapshot": "4.1.11", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -8306,12 +8074,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.8", - "@vitest/browser-preview": "4.1.8", - "@vitest/browser-webdriverio": "4.1.8", - "@vitest/coverage-istanbul": "4.1.8", - "@vitest/coverage-v8": "4.1.8", - "@vitest/ui": "4.1.8", + "@vitest/browser-playwright": "4.1.11", + "@vitest/browser-preview": "4.1.11", + "@vitest/browser-webdriverio": "4.1.11", + "@vitest/coverage-istanbul": "4.1.11", + "@vitest/coverage-v8": "4.1.11", + "@vitest/ui": "4.1.11", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -8634,9 +8402,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", + "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", "license": "MIT", "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index c7d54fa64..5350aeff1 100644 --- a/package.json +++ b/package.json @@ -3600,20 +3600,19 @@ "webpack": "webpack --mode development", "webpack-dev": "webpack --mode development --watch", "types": "npx -p typescript tsc ./src/extension.ts --declaration --allowJs --emitDeclarationOnly --outDir types --esModuleInterop -t es2022 --moduleResolution node --resolveJsonModule", - "postinstall": "npx tsx tools/downloadMapepire", "sqlsignature": "npx tsx tools/sqlSignature" }, "devDependencies": { - "@octokit/rest": "22.0.1", "@types/adm-zip": "0.5.7", "@types/node": "22.19.7", "@types/ssh2": "^1.15.5", "@types/tar": "6.1.13", "@types/tmp": "0.2.5", "@types/vscode": "^1.90.0", + "@types/ws": "^8.18.2", "@vscode/vsce": "^3.9.1", - "esbuild": "^0.27.0", - "esbuild-loader": "^4.4.2", + "esbuild": "0.28.2", + "esbuild-loader": "4.5.0", "eslint": "^8.57.1", "ssh2-streams": "^0.4.10", "ts-loader": "^9.3.1", @@ -3625,17 +3624,16 @@ }, "dependencies": { "@ibm/ibmi-eventf-parser": "2.0.2", - "@ibm/mapepire-js": "0.6.1", + "@ibm/mapepire-js": "1.0.1", "@vscode-elements/elements": "2.5.1", "@vscode/codicons": "0.0.45", - "adm-zip": "0.5.16", + "adm-zip": "0.6.1", "crc-32": "https://cdn.sheetjs.com/crc-32-latest/crc-32-latest.tgz", - "csv": "6.4.1", "escape-string-regexp": "5.0.0", "ignore": "7.0.5", "node-ssh": "13.2.1", - "tar": "^7.5.13", - "tmp": "0.2.6", + "tar": "7.5.22", + "tmp": "0.2.7", "vscode-diff": "3.0.1" }, "extensionDependencies": [ @@ -3643,4 +3641,4 @@ "halcyontechltd.vscode-ibmi-walkthroughs", "vscode.git" ] -} \ No newline at end of file +} diff --git a/src/api/IBMi.ts b/src/api/IBMi.ts index 22f98207f..986af8fe3 100644 --- a/src/api/IBMi.ts +++ b/src/api/IBMi.ts @@ -624,13 +624,14 @@ export default class IBMi { callbacks.progress({ message: `Loading remote configuration files.` }); await this.loadAndApplyRemoteConfigs(); - callbacks.progress({ message: `Checking Mapepire status.` }); + callbacks.progress({ message: `Checking temporary directory.` }); const tempDirSet = await this.checkOrCreateTempDirectory(); if (!tempDirSet) { this.config.tempDir = `~/.vscode/tmp`; } // We always start up Mapepire first + callbacks.progress({ message: `Checking Mapepire status.` }); let mapepireState; try { mapepireState = await this.componentManager.startupComponent(Mapepire.ID, quickConnect() ? cachedServerSettings?.installedComponents : []); @@ -646,26 +647,29 @@ export default class IBMi { callbacks.progress({ message: `Starting Mapepire.` }); const mapepire = await this.getComponent(Mapepire.ID); - if (mapepire) { - const hasJavaInstalled = (this.remoteFeatures.jdk21 || this.remoteFeatures.jdk17 || this.remoteFeatures.jdk11 || this.remoteFeatures.jdk80); - if (hasJavaInstalled) { - try { - this.sqlJob = await mapepire.newJob(this); - if (this.sqlJob.id) { - this.splfUserData = `C4I${this.sqlJob.id.substring(0, this.sqlJob.id.indexOf('/'))}`; - await this.sqlJob.execute(`CALL QSYS2.QCMDEXC('OVRPRTF FILE(*PRTF) SPOOL(*YES) HOLD(*YES) USRDTA(${this.splfUserData}) SPLFOWN(*CURUSRPRF) OVRSCOPE(*JOB)')`); - } - } catch (e: any) { - callbacks.message(`error`, `Failed to start Mapepire SQL job: ${e.message || e}`); - this.appendOutput(`Mapepire error: ${e.message || e}\n`); + + try { + if (mapepire) { + const hasJavaInstalled = (this.remoteFeatures.jdk21 || this.remoteFeatures.jdk17 || this.remoteFeatures.jdk11 || this.remoteFeatures.jdk80); + if (!this.getConfig().mapepireUseServer && !hasJavaInstalled) { + throw new Error(`No Java installation found. SQL operations will not be available. Please install Java 8, 11, 17 or 21.`); + } + + this.sqlJob = await mapepire.newJob(this); + if (this.sqlJob.id) { + this.splfUserData = `C4I${this.sqlJob.id.substring(0, this.sqlJob.id.indexOf('/'))}`; + await this.sqlJob.execute(`CALL QSYS2.QCMDEXC('OVRPRTF FILE(*PRTF) SPOOL(*YES) HOLD(*YES) USRDTA(${this.splfUserData}) SPLFOWN(*CURUSRPRF) OVRSCOPE(*JOB)')`); } - } else { - callbacks.message(`warning`, `No Java installation found. SQL operations will not be available. Please install Java 8, 11, or 17.`); - this.appendOutput(`Warning: No Java found for Mapepire\n`); } - } else { - callbacks.message(`warning`, `Mapepire component failed to start. SQL operations will not be available.`); - this.appendOutput(`Warning: Mapepire component not available\n`); + else { + throw new Error(`Mapepire component failed to start.`); + } + } + catch (e: any) { + const error = e.message || e; + callbacks.message(`error`, `Failed to start Mapepire SQL job: ${error}`); + this.appendOutput(`Mapepire error: ${error}\n`); + throw e; } try { diff --git a/src/api/IBMiContent.ts b/src/api/IBMiContent.ts index 0dbce8832..c3a546299 100644 --- a/src/api/IBMiContent.ts +++ b/src/api/IBMiContent.ts @@ -1,11 +1,10 @@ import crypto from 'crypto'; -import { parse } from 'csv-parse/sync'; +import escapeStringRegexp from 'escape-string-regexp'; import fs from 'fs'; import * as node_ssh from "node-ssh"; import path from 'path'; import tmp from 'tmp'; import util from 'util'; -import escapeStringRegexp from 'escape-string-regexp'; import { FilterType, parseFilter, singleGenericName } from './Filter'; import { default as IBMi } from './IBMi'; import { Tools } from './Tools'; @@ -427,62 +426,6 @@ export default class IBMiContent { return this.ibmi.runSQL(statements); } - /** - * Download the contents of a member from a table. - * @param library - * @param file - * @param member Will default to file provided - * @param deleteTable Will delete the table after download - */ - async getTable(library: string, file: string, member?: string, deleteTable?: boolean): Promise { - if (!member) member = file; //Incase mbr is the same file - - const tempRmt = Tools.ensureFullPath(this.getTempRemote(Tools.qualifyPath(library, file, member)), this.config.homeDirectory); - const copyResult = await this.ibmi.runCommand({ - command: `QSYS/CPYTOIMPF FROMFILE(${library}/${file} ${member}) ` + - `TOSTMF('${tempRmt}') ` + - `MBROPT(*REPLACE) STMFCCSID(1208) STMFCODPAG(*STMF) RCDDLM(*CRLF) DTAFMT(*DLM) RMVBLANK(*TRAILING) ADDCOLNAM(*SQL) FLDDLM(',') DECPNT(*PERIOD)`, - noLibList: true - }); - - if (copyResult.code === 0) { - let result = await this.downloadStreamfileRaw(tempRmt); - - if (this.config.autoClearTempData) { - Promise.allSettled([ - this.ibmi.sendCommand({ command: `rm -rf ${tempRmt}`, directory: `.` }), - deleteTable ? this.ibmi.runCommand({ command: `QSYS/DLTOBJ OBJ(${library}/${file}) OBJTYPE(*FILE)`, noLibList: true }) : Promise.resolve() - ]); - } - - return parse(result, { - columns: true, - skip_empty_lines: true, - cast: true, - onRecord(record) { - for (const key of Object.keys(record)) { - record[key] = record[key] === ` ` ? `` : record[key]; - } - return record; - } - }); - - } else { - throw new Error(`Failed fetching table: ${copyResult.stderr}`); - } - - } - - /** - * Prepare a table in QTEMP using any number of preparation queries and return its content. - * @param prepareQueries : SQL statements that should create a table in QTEMP - * @param table : the name of the table expected to be found in QTEMP - * @returns : the table's content - */ - getQTempTable(prepareQueries: string[], table: string): Promise { - return this.runStatements(...prepareQueries, `select * from QTEMP.${table}`); - } - /** * Get list of libraries with description and attribute * @param libraries Array of libraries to retrieve diff --git a/src/api/components/manager.ts b/src/api/components/manager.ts index 58e761fa0..59168da92 100644 --- a/src/api/components/manager.ts +++ b/src/api/components/manager.ts @@ -137,7 +137,7 @@ export class ComponentManager { if (component) { component.component.reset?.(); - const state = component.handleState(await component.component.getRemoteState(this.connection, await component.getInstallDirectory())); + const state = component.handleState(await component.component.getRemoteState(this.connection, component.getInstallDirectory())); component.overrideState(state); return state; } diff --git a/src/api/components/mapepire/index.ts b/src/api/components/mapepire/index.ts index 42e3008dc..55da02f88 100644 --- a/src/api/components/mapepire/index.ts +++ b/src/api/components/mapepire/index.ts @@ -1,132 +1,56 @@ -import { JDBCOptions, SQLJob } from "@ibm/mapepire-js"; -import { stat } from "fs/promises"; +import { createNodeSSHConnection, JDBCOptions, JAR_SHA256 as MAPEPIRE_SIGNATURE, VERSION as MAPEPIRE_VERSION, SQLJob } from "@ibm/mapepire-js"; import path from "path"; -import { SemanticVersion } from "../../../typings"; import { getJavaHome } from "../../configuration/DebugConfiguration"; import IBMi from "../../IBMi"; -import { Tools } from "../../Tools"; import { IBMiComponent, SecureComponentState } from "../component"; -import { SSHSQLJob } from "./sshSqlJob"; -import { SERVER_FILE_PREFIX, SERVER_VERSION_FILE, VERSION } from "./version"; - -const DEFAULT_JAVA_EIGHT = `/QOpenSys/QIBM/ProdData/JavaVM/jdk80/64bit`; export class Mapepire implements IBMiComponent { static readonly ID = "mapepire"; - private static readonly SIGNATURE = "41b1cfa67778ac204426f1dda0b51bd3f45fe3b89c91121d968660140acc0876"; - - private readonly localAssetPath: string; - private installPath = ""; - private readonly version: SemanticVersion; private readonly jobs: Map = new Map; + private readonly status: SecureComponentState = { status: "Installed", remoteSignature: MAPEPIRE_SIGNATURE }; + private installDirectory = ""; - constructor(localAssetRoot: string, private readonly passwordProvider?: (connectionName: IBMi) => Promise) { - this.localAssetPath = path.join(localAssetRoot, SERVER_VERSION_FILE); - const rawVersion = /-(\d+)\.(\d+)\.(\d+)\.jar$/.exec(SERVER_VERSION_FILE); - if (rawVersion) { - this.version = { major: Number(rawVersion[1]), minor: Number(rawVersion[2]), patch: Number(rawVersion[3]) }; - } - else { - this.version = { major: 0, minor: 0, patch: 0 }; - } - } - - getIdentification() { - return { name: Mapepire.ID, version: VERSION, signature: Mapepire.SIGNATURE }; - } - - async setInstallDirectory(installDirectory: string): Promise { - this.installPath = path.posix.join(installDirectory, path.basename(this.localAssetPath)); - } - - async getRemoteState(connection: IBMi, installDirectory: string): Promise { - this.setInstallDirectory(installDirectory); - if (connection.getConfig().mapepireUseServer) { - //No need to upload/check remote JAR file in server mode - return { status: "Installed", remoteSignature: Mapepire.SIGNATURE }; - } - - const remoteVersions = (await connection.sendCommand({ command: `/QOpenSys/usr/bin/find "${Tools.escapePath(installDirectory, true)}" -type f -name ${SERVER_FILE_PREFIX}\\*` })) - .stdout.split("\n") - .map(line => line.trim().substring(2)) - .map(line => new RegExp(`${SERVER_FILE_PREFIX}(\\d+)\\.(\\d+)\\.(\\d+)\\.jar$`).exec(line)) - .filter(Boolean) - .map(version => ({ major: Number(version![1]), minor: Number(version![2]), patch: Number(version![3]) } as SemanticVersion)); - if (remoteVersions.length === 0) { - return { status: "NotInstalled" }; - } - else if (remoteVersions.every(remoteVersion => remoteVersion.major < this.version.major || (remoteVersion.major === this.version.major && remoteVersion.minor < this.version.minor) || (remoteVersion.major === this.version.major && remoteVersion.minor === this.version.minor && remoteVersion.patch < this.version.patch))) { - return { status: "NeedsUpdate" }; - } + constructor(public application: string, private readonly passwordProvider?: (connectionName: IBMi) => Promise) { - return { status: "Installed", remoteSignature: await connection.getContent().getSHA256FileHash(this.installPath) }; } - - async update(connection: IBMi): Promise { - if (connection.getConfig().mapepireUseServer) { - //No need to upload the remote JAR file in server mode - return { status: "Installed", remoteSignature: Mapepire.SIGNATURE }; - } - - try { - if (!this.localAssetPath) { - throw "Local Mapepire asset not set!"; - } - - const assetExistsLocally = await exists(this.localAssetPath); - if (!assetExistsLocally) { - throw `Local Mapepire asset not found at ${this.localAssetPath}!`; - } - - await connection.getContent().uploadFiles([{ local: this.localAssetPath, remote: this.installPath }]); - const result = await connection.sendCommand({ command: `chmod +x "${Tools.escapePath(this.installPath, true)}"` }); - if (result.code !== 0) { - throw `Failed to make Mapepire jar file executable: ${result.stderr}`; - } - } - catch (error: any) { - connection.appendOutput(String(error)); - return { status: "Error" }; - } - - return { status: "Installed", remoteSignature: await connection.getContent().getSHA256FileHash(this.installPath) }; + getIdentification() { + return { name: Mapepire.ID, version: MAPEPIRE_VERSION, signature: MAPEPIRE_SIGNATURE }; } - getInitCommand(javaHome: string): string | undefined { - if (this.installPath) { - return `${javaHome ? path.posix.join(javaHome, `bin`, `java`) : 'java'} -Dos400.stdio.convert=N -jar "${Tools.escapePath(this.installPath, true)}" --single` - } + async getRemoteState(_connection: IBMi, installDirectory: string): Promise { + this.installDirectory = installDirectory; + //Remote check is managed by mapepire-js - we always assume it's OK at this stage + return this.status; } - public static async useExec(connection: IBMi) { - let useExec = false; - const bashPathAvailable = connection.remoteFeatures[`bash`]; - if (bashPathAvailable) { - const commandShellResult = await connection.sendCommand({ - command: `echo $SHELL` - }); - if (!commandShellResult.stderr) { - let userDefaultShell = commandShellResult.stdout.trim(); - if (userDefaultShell === bashPathAvailable) { - useExec = true; - } - } - } - - return useExec; + async update(_connection: IBMi): Promise { + //Update is managed by mapepire-js + return this.status; } - public async newJob(connection: IBMi, options?: { javaPath?: string, jdbc?: JDBCOptions }) { + public async newJob(connection: IBMi, options?: { javaPath?: string, jdbc?: JDBCOptions, application?: string }) { const config = connection.getConfig(); const useServer = config.mapepireUseServer; - const sqlJob = useServer ? new SQLJob(options?.jdbc) : new SSHSQLJob(options?.jdbc); + const sqlJob = useServer ? + //websocket client + new SQLJob() : + //single mode + SQLJob.withConfig({ + transport: "ssh-single", + sshSingle: { + ...createNodeSSHConnection(connection.client!), + javaPath: getJavaPath(connection, options?.javaPath), + privateInstallDir: this.installDirectory + } + }); sqlJob.options.secure = sqlJob.options.secure || config.secureSQL; sqlJob.options.naming = sqlJob.options.naming || config.sqlJobNaming as ("sql" | "system" | undefined); sqlJob.options["extended metadata"] = sqlJob.options["extended metadata"] ?? config.mapepireExtendedMetadata; + const application = options?.application || this.application; if (useServer) { connection.appendOutput(`Connecting to Mapepire over HTTP on port ${config.mapepireServerPort}${config.mapepireAllowSelfCert ? ", allowing self-signed certificates" : ""}`); //HTTP connection @@ -134,30 +58,20 @@ export class Mapepire implements IBMiComponent { if (!password) { throw new Error("No password provided; cannot connect to Mapepire Server"); } - await sqlJob.connect({ - host: connection.currentHost, - user: connection.currentUser, - password, - rejectUnauthorized: (config.mapepireAllowSelfCert !== true), - port: config.mapepireServerPort - }); + await sqlJob.connect( + { + host: connection.currentHost, + user: connection.currentUser, + password, + rejectUnauthorized: (config.mapepireAllowSelfCert !== true), + port: config.mapepireServerPort + }, + application + ); } else { //Single mode over SSH - connection.appendOutput(`Connecting to Mapepire over SSH in single mode`); - const sshJob = sqlJob as SSHSQLJob; - let javaPath = options?.javaPath; - if (!javaPath) { - const javaVersion = config.mapepireJavaVersion; - if (Number.isNaN(Number(javaVersion))) { - javaPath = ""; - } - else { - javaPath = getJavaHome(connection, javaVersion) || DEFAULT_JAVA_EIGHT; - } - } - const stream = await sshJob.getSshChannel(this, connection, javaPath); - await sshJob.connectSsh(connection, stream); + await sqlJob.connect(undefined, application); } this.jobs.set(sqlJob.getUniqueId(), sqlJob); @@ -185,11 +99,16 @@ export class Mapepire implements IBMiComponent { } } -async function exists(path: string) { - try { - await stat(path); - return true; - } catch (e) { - return false; +function getJavaPath(connection: IBMi, javaPath?: string) { + if (!javaPath) { + const javaVersion = connection.getConfig().mapepireJavaVersion; + if (!Number.isNaN(Number(javaVersion))) { + const javaHome = getJavaHome(connection, javaVersion) || undefined; + if (javaHome) { + javaPath = path.posix.join(javaHome, 'bin', 'java'); + } + } } + + return javaPath; } \ No newline at end of file diff --git a/src/api/components/mapepire/sshSqlJob.ts b/src/api/components/mapepire/sshSqlJob.ts deleted file mode 100644 index 06ea1c341..000000000 --- a/src/api/components/mapepire/sshSqlJob.ts +++ /dev/null @@ -1,159 +0,0 @@ -import type { ConnectionResult, JDBCOptions, ServerRequest, ServerResponse } from "@ibm/mapepire-js"; -import { SQLJob } from "@ibm/mapepire-js"; -import { ClientChannel } from "ssh2"; -import { Mapepire } from "."; -import IBMi from "../../IBMi"; -import { JobStatus } from "./types"; - -export class SSHSQLJob extends SQLJob { - static application = ""; - private channel: ClientChannel | undefined; - - async getSshChannel(mapepire: Mapepire, connection: IBMi, javaPath: string): Promise { - const useExec = await Mapepire.useExec(connection); - - return new Promise((resolve, reject) => { - // Setting QIBM_JAVA_STDIO_CONVERT and QIBM_PASE_DESCRIPTOR_STDIO to make sure all PASE and Java converters are off - const startingCommand = `QIBM_JAVA_STDIO_CONVERT=N QIBM_PASE_DESCRIPTOR_STDIO=B QIBM_USE_DESCRIPTOR_STDIO=Y QIBM_MULTI_THREADED=Y ${useExec ? `exec ` : ``}` + mapepire.getInitCommand(javaPath); - connection.appendOutput(`Starting Mapepire: ${startingCommand}\n`); - connection.client?.connection?.exec(startingCommand, {}, (err, stream) => { - if (err) { - reject(err); - } - - let outString = ``; - - stream.stderr.on(`data`, (data: Buffer) => { - const error = data?.toString("utf-8") || "Undefined error"; - connection.appendOutput(`Mapepire error: ${error}\n`); - console.log(error); - }) - - stream.stdout.on(`data`, (data: Buffer) => { - outString += data.toString("utf-8"); - if (outString.endsWith(`\n`)) { - for (const thisMsg of outString.split(`\n`)) { - if (thisMsg === ``) continue; - - outString = ``; - try { - const response: ServerResponse = JSON.parse(thisMsg); - this.responseEmitter.emit(response.id, response); - } catch (e: any) { - const error = `Mapepire output error: ${e}\nData: ${thisMsg}`; - connection.appendOutput(error + "\n"); - console.log(e); - outString = ``; - } - } - } - }); - - resolve(stream); - }); - }) - } - - override async send(content: ServerRequest): Promise { - if (!this.channel) { - throw new Error("SQL client is not yet setup."); - } - if (this.isTracingChannelData) console.log(JSON.stringify(content)); - - this.channel.stdin.write(JSON.stringify(content) + `\n`); - return new Promise((resolve, reject) => { - this.responseEmitter.on(content.id, (x: ServerResponse) => { - this.responseEmitter.removeAllListeners(x.id); - resolve(x as T); - }); - }); - } - - getStatus(): JobStatus { - const currentListenerCount = this.responseEmitter.eventNames().length; - return this.channel && currentListenerCount > 0 ? JobStatus.BUSY : this.status as JobStatus; - } - - /** - * The same as mapepire-js#connect, but with SSH - */ - async connectSsh(connection: IBMi, channel: ClientChannel): Promise { - // this.isTracingChannelData = true; - - this.channel = channel; - - this.channel.on(`error`, (err: any) => { - console.warn(err); - connection.appendOutput(`Mapepire channel error: ${err}\n`); - this.end(); - }) - - this.channel.on(`close`, (code: number) => { - console.warn(`Mapepire exited with code ${code}.`); - connection.appendOutput(`Mapepire exited with code ${code}.\n`); - this.end(); - }) - - const props = (Object - .keys(this.options) as { [key: string]: any }) - .filter((prop: keyof JDBCOptions) => this.options[prop] !== `` && this.options[prop] !== null && this.options[prop] !== undefined) // 0 is valid - .map((prop: keyof JDBCOptions) => { - if (Array.isArray(this.options[prop])) { - return `${prop}=${(this.options[prop] as string[]).join(`,`)}`; - } else { - return `${prop}=${this.options[prop]}`; - } - }) - .join(`;`) - - const connectionObject = { - id: SSHSQLJob.getNewUniqueId(), - type: `connect`, - //technique: (getInstance().getConnection().qccsid === 65535 || this.options["database name"]) ? `tcp` : `cli`, //TODO: investigate why QCCSID 65535 breaks CLI and if there is any workaround - technique: `tcp`, // TODO: DOVE does not work in cli mode - application: SSHSQLJob.application, - props: props.length > 0 ? props : undefined - } - - const connectResult = await this.send(connectionObject); - - if (connectResult.success === true) { - this.status = JobStatus.READY; - } else { - this.end(); - this.status = JobStatus.NOT_STARTED; - throw new Error(connectResult.error || `Failed to connect to server.`); - } - - this.id = connectResult.job; - this.isTracingChannelData = false; - - return connectResult; - } - - async close() { - const exitObject: ServerRequest = { - id: SSHSQLJob.getNewUniqueId(), - type: `exit` - }; - - this.send(exitObject); - - this.responseEmitter.eventNames().forEach(event => { - this.responseEmitter.emit(event, JSON.stringify({ - id: event, - success: false, - error: `Job ended before response returned.` - })); - }); - - this.end(); - } - - private end() { - this.channel?.close(); - this.channel = undefined; - this.status = JobStatus.ENDED; - this.responseEmitter.removeAllListeners(); - } -} \ No newline at end of file diff --git a/src/api/components/mapepire/types.ts b/src/api/components/mapepire/types.ts deleted file mode 100644 index dcd7c367c..000000000 --- a/src/api/components/mapepire/types.ts +++ /dev/null @@ -1,9 +0,0 @@ - -// Redefined from mapepire-js -export enum JobStatus { - NOT_STARTED = "notStarted", - CONNECTING = "connecting", - READY = "ready", - BUSY = "busy", - ENDED = "ended" -} diff --git a/src/api/components/mapepire/version.ts b/src/api/components/mapepire/version.ts deleted file mode 100644 index bff0aae93..000000000 --- a/src/api/components/mapepire/version.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const VERSION = `2.3.5`; -export const SERVER_VERSION_TAG = `v${VERSION}`; -export const SERVER_FILE_PREFIX = `mapepire-server-`; -export const SERVER_VERSION_FILE = `mapepire-server-${VERSION}.jar`; \ No newline at end of file diff --git a/src/api/components/runtime.ts b/src/api/components/runtime.ts index 026527ea8..ef0dcada9 100644 --- a/src/api/components/runtime.ts +++ b/src/api/components/runtime.ts @@ -60,7 +60,7 @@ export class IBMiComponentRuntime { } async getCurrentState(){ - return this.handleState(await this.component.getRemoteState(this.connection, await this.getInstallDirectory())); + return this.handleState(await this.component.getRemoteState(this.connection, this.getInstallDirectory())); } /** diff --git a/src/api/tests/connection.ts b/src/api/tests/connection.ts index c33ba7efa..d2c5ad9d5 100644 --- a/src/api/tests/connection.ts +++ b/src/api/tests/connection.ts @@ -1,4 +1,3 @@ -import path from "path"; import IBMi from "../IBMi"; import { extensionComponentRegistry } from "../components/manager"; import { Mapepire } from "../components/mapepire"; @@ -70,7 +69,7 @@ export async function newConnection(reloadSettings?: boolean) { const conn = new IBMi(); //The password is required when connecting to a Mapepire Server (mapepireUseServer) - const mapepire = new Mapepire(path.join(__dirname, `..`, `..`, `..`, `dist`), async () => ENV_CREDS.password); + const mapepire = new Mapepire("Code for IBM i - Unit tests", async () => ENV_CREDS.password); const testingId = `testing`; extensionComponentRegistry.registerComponent(testingId, mapepire); @@ -90,7 +89,7 @@ export async function newConnection(reloadSettings?: boolean) { config.tempLibrary = ENV_CREDS.tempLibrary; updateConfig = true; } - + if (config.iasp !== ENV_CREDS.iasp) { config.iasp = ENV_CREDS.iasp; updateConfig = true; diff --git a/src/api/tests/suites/content.test.ts b/src/api/tests/suites/content.test.ts index 49fde30b6..0d10f5ca9 100644 --- a/src/api/tests/suites/content.test.ts +++ b/src/api/tests/suites/content.test.ts @@ -294,18 +294,6 @@ describe('Content Tests', { concurrent: true }, () => { expect(moreRowsThanAvailable?.length).toBe(allRows.length); }); - it('Test getTable', async () => { - const content = connection.getContent(); - - const rows = await content.getTable('qiws', 'qcustcdt', '*all'); - - expect(rows?.length).not.toBe(0); - const firstRow = rows![0]; - - expect(typeof firstRow['BALDUE']).toBe('number'); - expect(typeof firstRow['CITY']).toBe('string'); - }); - it('Test validateLibraryList', async () => { const content = connection.getContent(); @@ -584,39 +572,6 @@ describe('Content Tests', { concurrent: true }, () => { } }); - it('getQtempTable', async () => { - const content = connection.getContent(); - - const queries = [ - `CALL QSYS2.QCMDEXC('DSPOBJD OBJ(QSYSINC/*ALL) OBJTYPE(*ALL) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DSPOBJD)')`, - `Create Table QTEMP.OBJECTS As ( - Select ODLBNM as LIBRARY, - ODOBNM as NAME, - ODOBAT as ATTRIBUTE, - ODOBTP as TYPE, - Coalesce(ODOBTX, '') as TEXT - From QTEMP.DSPOBJD - ) With Data` - ]; - - - const nosqlContent = await content?.getQTempTable(queries, "OBJECTS"); - const objects = nosqlContent?.map(row => ({ - library: row.LIBRARY, - name: row.NAME, - attribute: row.ATTRIBUTE, - type: row.TYPE, - text: row.TEXT, - })); - expect(objects?.length).not.toBe(0); - expect(objects?.every(obj => obj.library === "QSYSINC")).toBe(true); - - const qrpglesrc = objects?.find(obj => obj.name === "QRPGLESRC"); - expect(qrpglesrc).toBeDefined(); - expect(qrpglesrc?.attribute).toBe("PF"); - expect(qrpglesrc?.type).toBe("*FILE"); - }); - it('toCl', () => { const command = connection.getContent().toCl("TEST", { ZERO: 0, diff --git a/src/extension.ts b/src/extension.ts index 0bcc4e0ac..3dfc09f7a 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,13 +4,11 @@ import { commands, ExtensionContext, l10n, languages, window, workspace } from " // this method is called when your extension is activated // your extension is activated the very first time the command is executed -import path from "path"; import IBMi from "./api/IBMi"; import { SearchTools } from "./api/SearchTools"; import { ActionTools } from "./api/actions"; import { extensionComponentRegistry } from "./api/components/manager"; import { Mapepire } from "./api/components/mapepire"; -import { SSHSQLJob } from "./api/components/mapepire/sshSqlJob"; import { parseErrors } from "./api/errors/parser"; import { CustomCLI } from "./api/tests/components/customCli"; import { onCodeForIBMiConfigurationChange, ViewSettings } from "./config/Configuration"; @@ -54,11 +52,6 @@ export async function activate(context: ExtensionContext): Promise // This line of code will only be executed once when your extension is activated console.log(`Congratulations, your extension "code-for-ibmi" is now active!`); - SSHSQLJob.application = `${context.extension.packageJSON.name} ${context.extension.packageJSON.version}`; - commands.registerCommand(`code-for-ibmi.sshSqlJob.appendApplicationName`, (applicationName: string) => { - SSHSQLJob.application = `${applicationName} | ${SSHSQLJob.application}`; - }); - await loadAllofExtension(context); const updateLastConnectionAndServerCache = () => { @@ -146,10 +139,16 @@ export async function activate(context: ExtensionContext): Promise }); } - const mapepire = new Mapepire(path.join(context.extensionPath, `dist`), async (connection) => { + const mapepire = new Mapepire(`${context.extension.packageJSON.name} ${context.extension.packageJSON.version}`, async (connection) => { return await getPassword(connection, l10n.t(`Password for user profile {0} on {1} is required to connect to Mapepire Server.`, connection.currentUser, connection.currentConnectionName)); }); extensionComponentRegistry.registerComponent(context, mapepire); + + context.subscriptions.push( + commands.registerCommand(`code-for-ibmi.sshSqlJob.appendApplicationName`, (applicationName: string) => { + mapepire.application = applicationName; + }) + ); registerURIHandler(context, sandboxURIHandler, diff --git a/src/ui/views/helpView.ts b/src/ui/views/helpView.ts index c4235abce..9e269cc77 100644 --- a/src/ui/views/helpView.ts +++ b/src/ui/views/helpView.ts @@ -230,15 +230,11 @@ async function downloadLogs() { zip.addFile(log.fileName, log.fileContent); } - const result = await zip.writeZipPromise(downloadLocation, { overwrite: false }); - - if (result) { - const result = await vscode.window.showInformationMessage(vscode.l10n.t(`Successfully downloaded logs to {0}`, zipFile), vscode.l10n.t(`Open`)); - if (result && result === vscode.l10n.t(`Open`)) { - vscode.commands.executeCommand('revealFileInOS', vscode.Uri.file(downloadLocation)) - } - } else { - await vscode.window.showErrorMessage(vscode.l10n.t(`Failed to downloaded logs to {0}`, zipFile)); + await zip.writeZipPromise(downloadLocation, { overwrite: false }); + + const result = await vscode.window.showInformationMessage(vscode.l10n.t(`Successfully downloaded logs to {0}`, zipFile), vscode.l10n.t(`Open`)); + if (result && result === vscode.l10n.t(`Open`)) { + vscode.commands.executeCommand('revealFileInOS', vscode.Uri.file(downloadLocation)) } } catch (error: any) { await vscode.window.showErrorMessage(vscode.l10n.t(`Failed to download logs to {0}. {1}`, zipFile, error)); diff --git a/tools/downloadMapepire.ts b/tools/downloadMapepire.ts deleted file mode 100644 index c8d3a0e41..000000000 --- a/tools/downloadMapepire.ts +++ /dev/null @@ -1,72 +0,0 @@ -import path from "path"; - -import { Octokit } from "@octokit/rest"; -import { existsSync, mkdirSync, statSync } from "fs"; -import { writeFile } from "fs/promises"; -import { SERVER_VERSION_FILE, SERVER_VERSION_TAG } from "../src/api/components/mapepire/version"; - -async function work() { - const distDirectory = path.join(`.`, `dist`); - if (!existsSync(distDirectory)) { - mkdirSync(distDirectory); - } - - const serverFile = path.join(distDirectory, SERVER_VERSION_FILE); - - if (exists(serverFile)) { - console.log(`Server file exists: ${SERVER_VERSION_FILE}`) - return; - } - - const octokit = new Octokit(); - - const owner = `Mapepire-IBMi`; - const repo = `mapepire-server`; - - try { - const result = await octokit.request(`GET /repos/{owner}/{repo}/releases/tags/${SERVER_VERSION_TAG}`, { - owner, - repo, - headers: { - 'X-GitHub-Api-Version': '2022-11-28' - } - }); - - const newAsset = result.data.assets.find((asset: any) => asset.name.endsWith(`.jar`)); - - if (newAsset) { - console.log(`Asset found: ${newAsset.name}`); - - const url = newAsset.browser_download_url; - - await downloadFile(url, serverFile); - - console.log(`Asset downloaded: ${serverFile}`); - console.log(`Asset digest: ${newAsset.digest}`); - - } else { - console.log(`Release found but no asset found.`); - } - - - } catch (e) { - console.log(e); - } -} - -function downloadFile(url: string, outputPath: string) { - return fetch(url) - .then(x => x.arrayBuffer()) - .then(x => writeFile(outputPath, Buffer.from(x))); -} - -function exists(localPath: string): boolean { - try { - statSync(localPath) - return true; - } catch (e) { - return false; - } -} - -work(); \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index 1f58386f9..9208c5df4 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -7,6 +7,7 @@ const fs = require(`fs`); const path = require(`path`); const packageJson = require(`./package.json`); +const { SERVER_FILE_PREFIX, VERSION } = require(`@ibm/mapepire-js`); const npm_runner = process.env[`npm_lifecycle_script`]; const isProduction = (npm_runner && npm_runner.includes(`production`)); @@ -25,9 +26,10 @@ if (isProduction) { const dist = path.resolve(__dirname, `dist`); -fs.mkdirSync(dist, {recursive: true}); - -const files = []; +fs.mkdirSync(dist, { recursive: true }); +const files = [ + { name: `${SERVER_FILE_PREFIX}${VERSION}.jar`, relative: `node_modules/@ibm/mapepire-js/dist/${SERVER_FILE_PREFIX}${VERSION}.jar` } +]; for (const file of files) { const src = path.resolve(__dirname, file.relative); @@ -38,7 +40,7 @@ for (const file of files) { // Overwrites by default fs.copyFileSync(src, dest); } - else{ + else { throw `File ${src} not found for copy!` } }