diff --git a/package-lock.json b/package-lock.json index eeeb411e..f82d048f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@dfinity/identity": "^2.3.0", "@dfinity/principal": "^2.3.0", "@junobuild/admin": "^0.1.6", - "@junobuild/cli-tools": "^0.1.4", + "@junobuild/cli-tools": "^0.1.6", "@junobuild/config-loader": "^0.2.0", "@junobuild/core": "^0.1.9", "@junobuild/did-tools": "^0.2.0", @@ -699,7 +699,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -716,7 +715,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -733,7 +731,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -750,7 +747,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -767,7 +763,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -784,7 +779,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -801,7 +795,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -818,7 +811,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -835,7 +827,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -852,7 +843,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -869,7 +859,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -886,7 +875,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -903,7 +891,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -920,7 +907,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -937,7 +923,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -954,7 +939,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -971,7 +955,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -988,7 +971,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1005,7 +987,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1022,7 +1003,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1039,7 +1019,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1056,7 +1035,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1073,7 +1051,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1090,7 +1067,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1107,7 +1083,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1498,19 +1473,20 @@ } }, "node_modules/@junobuild/cli-tools": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@junobuild/cli-tools/-/cli-tools-0.1.4.tgz", - "integrity": "sha512-wUyR/xygc/7xuFV1QA7eUaaT2fGMVCy4MjzGKpihSZXxgBdsEwW9TxEunb1wkV0XX0Sf1ASQSlcFFrMpcpRVig==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@junobuild/cli-tools/-/cli-tools-0.1.6.tgz", + "integrity": "sha512-WN769rzl9effZ39Tmegi8F0qDOU04Ks1QXMG8Yh0D3wquynwHOVSDQjrRYCZeYIfwCnkkFPCpYaOmaUGSv9l5A==", "license": "MIT", "dependencies": { - "file-type": "^20.1.0", + "file-type": "^20.4.1", "listr": "^0.14.3", "mime-types": "^2.1.35", "minimatch": "^10.0.1" }, "peerDependencies": { "@dfinity/utils": "^2", - "@junobuild/config": "*" + "@junobuild/config": "*", + "esbuild": "^0.25.1" } }, "node_modules/@junobuild/config": { @@ -1684,17 +1660,17 @@ } }, "node_modules/@tokenizer/inflate": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.6.tgz", - "integrity": "sha512-SdR/i05U7Xhnsq36iyIq/ZiGGw4PKzw4ww3bOq80Pjj4wyXpqyTcgrgdDdGlcatnlvzNJx8CQw3hp6QZvkUwhA==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", + "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", "license": "MIT", "dependencies": { - "debug": "^4.3.7", + "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "type": "github", @@ -3168,7 +3144,6 @@ "version": "0.25.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", - "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -3871,9 +3846,9 @@ } }, "node_modules/file-type": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.1.0.tgz", - "integrity": "sha512-XoxU+lETfCf+bYK3SXkxFusAvmtYQl1u/ZC4zw1DBLEsHUvh339uwYucgQnnSMz1mRCWYJrCzsbJJ95hsQbZ8A==", + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.4.1.tgz", + "integrity": "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==", "license": "MIT", "dependencies": { "@tokenizer/inflate": "^0.2.6", @@ -5760,9 +5735,9 @@ "license": "MIT" }, "node_modules/peek-readable": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-6.1.1.tgz", - "integrity": "sha512-7QmvgRKhxM0E2PGV4ocfROItVode+ELI27n4q+lpufZ+tRKBu/pBP8WOmw9HXn2ui/AUizqtvaVQhcJrOkRqYg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-7.0.0.tgz", + "integrity": "sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==", "license": "MIT", "engines": { "node": ">=18" @@ -6507,13 +6482,13 @@ } }, "node_modules/strtok3": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.2.1.tgz", - "integrity": "sha512-Q2dTnW3UXokAvXmXvrvMoUj/me3LyJI76HNHeuGMh2o0As/vzd7eHV3ncLOyvu928vQIDbE7Vf9ldEnC7cwy1w==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.2.2.tgz", + "integrity": "sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==", "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0", - "peek-readable": "^6.1.1" + "peek-readable": "^7.0.0" }, "engines": { "node": ">=18" @@ -7487,175 +7462,150 @@ "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", - "dev": true, "optional": true }, "@esbuild/android-arm": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", - "dev": true, "optional": true }, "@esbuild/android-arm64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", - "dev": true, "optional": true }, "@esbuild/android-x64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", - "dev": true, "optional": true }, "@esbuild/darwin-arm64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", - "dev": true, "optional": true }, "@esbuild/darwin-x64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", - "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", - "dev": true, "optional": true }, "@esbuild/freebsd-x64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", - "dev": true, "optional": true }, "@esbuild/linux-arm": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", - "dev": true, "optional": true }, "@esbuild/linux-arm64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", - "dev": true, "optional": true }, "@esbuild/linux-ia32": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", - "dev": true, "optional": true }, "@esbuild/linux-loong64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", - "dev": true, "optional": true }, "@esbuild/linux-mips64el": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", - "dev": true, "optional": true }, "@esbuild/linux-ppc64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", - "dev": true, "optional": true }, "@esbuild/linux-riscv64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", - "dev": true, "optional": true }, "@esbuild/linux-s390x": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", - "dev": true, "optional": true }, "@esbuild/linux-x64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", - "dev": true, "optional": true }, "@esbuild/netbsd-arm64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", - "dev": true, "optional": true }, "@esbuild/netbsd-x64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", - "dev": true, "optional": true }, "@esbuild/openbsd-arm64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", - "dev": true, "optional": true }, "@esbuild/openbsd-x64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", - "dev": true, "optional": true }, "@esbuild/sunos-x64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", - "dev": true, "optional": true }, "@esbuild/win32-arm64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", - "dev": true, "optional": true }, "@esbuild/win32-ia32": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", - "dev": true, "optional": true }, "@esbuild/win32-x64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", - "dev": true, "optional": true }, "@eslint-community/eslint-utils": { @@ -7904,11 +7854,11 @@ "requires": {} }, "@junobuild/cli-tools": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@junobuild/cli-tools/-/cli-tools-0.1.4.tgz", - "integrity": "sha512-wUyR/xygc/7xuFV1QA7eUaaT2fGMVCy4MjzGKpihSZXxgBdsEwW9TxEunb1wkV0XX0Sf1ASQSlcFFrMpcpRVig==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@junobuild/cli-tools/-/cli-tools-0.1.6.tgz", + "integrity": "sha512-WN769rzl9effZ39Tmegi8F0qDOU04Ks1QXMG8Yh0D3wquynwHOVSDQjrRYCZeYIfwCnkkFPCpYaOmaUGSv9l5A==", "requires": { - "file-type": "^20.1.0", + "file-type": "^20.4.1", "listr": "^0.14.3", "mime-types": "^2.1.35", "minimatch": "^10.0.1" @@ -8012,11 +7962,11 @@ } }, "@tokenizer/inflate": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.6.tgz", - "integrity": "sha512-SdR/i05U7Xhnsq36iyIq/ZiGGw4PKzw4ww3bOq80Pjj4wyXpqyTcgrgdDdGlcatnlvzNJx8CQw3hp6QZvkUwhA==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", + "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", "requires": { - "debug": "^4.3.7", + "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" }, @@ -8942,7 +8892,6 @@ "version": "0.25.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", - "dev": true, "requires": { "@esbuild/aix-ppc64": "0.25.1", "@esbuild/android-arm": "0.25.1", @@ -9422,9 +9371,9 @@ } }, "file-type": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.1.0.tgz", - "integrity": "sha512-XoxU+lETfCf+bYK3SXkxFusAvmtYQl1u/ZC4zw1DBLEsHUvh339uwYucgQnnSMz1mRCWYJrCzsbJJ95hsQbZ8A==", + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.4.1.tgz", + "integrity": "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==", "requires": { "@tokenizer/inflate": "^0.2.6", "strtok3": "^10.2.0", @@ -10623,9 +10572,9 @@ "dev": true }, "peek-readable": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-6.1.1.tgz", - "integrity": "sha512-7QmvgRKhxM0E2PGV4ocfROItVode+ELI27n4q+lpufZ+tRKBu/pBP8WOmw9HXn2ui/AUizqtvaVQhcJrOkRqYg==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-7.0.0.tgz", + "integrity": "sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==" }, "picocolors": { "version": "1.1.1", @@ -11062,12 +11011,12 @@ "dev": true }, "strtok3": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.2.1.tgz", - "integrity": "sha512-Q2dTnW3UXokAvXmXvrvMoUj/me3LyJI76HNHeuGMh2o0As/vzd7eHV3ncLOyvu928vQIDbE7Vf9ldEnC7cwy1w==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.2.2.tgz", + "integrity": "sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==", "requires": { "@tokenizer/token": "^0.3.0", - "peek-readable": "^6.1.1" + "peek-readable": "^7.0.0" } }, "stubborn-fs": { diff --git a/package.json b/package.json index b731e1f6..9dbe13f6 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@dfinity/identity": "^2.3.0", "@dfinity/principal": "^2.3.0", "@junobuild/admin": "^0.1.6", - "@junobuild/cli-tools": "^0.1.4", + "@junobuild/cli-tools": "^0.1.6", "@junobuild/config-loader": "^0.2.0", "@junobuild/core": "^0.1.9", "@junobuild/did-tools": "^0.2.0", diff --git a/scripts/esbuild.mjs b/scripts/esbuild.mjs index 8a9b70c1..b3f6e652 100644 --- a/scripts/esbuild.mjs +++ b/scripts/esbuild.mjs @@ -1,12 +1,31 @@ import {config} from 'dotenv'; import esbuild from 'esbuild'; -import {existsSync, mkdirSync, writeFileSync} from 'node:fs'; +import {existsSync, mkdirSync, readFileSync, writeFileSync} from 'node:fs'; import {join} from 'node:path'; config({ path: process.env.NODE_ENV === 'development' ? `.env.development` : `.env.production` }); +export const PACKAGE_JSON = 'package.json'; + +const readPackageJson = () => { + const packageJson = join(process.cwd(), PACKAGE_JSON); + const json = readFileSync(packageJson, 'utf8'); + const {peerDependencies, devDependencies} = JSON.parse(json); + return { + peerDependencies: peerDependencies ?? {}, + devDependencies: devDependencies ?? devDependencies + }; +}; + +const {peerDependencies, devDependencies} = readPackageJson(); + +export const externalDependencies = [ + ...Object.keys(peerDependencies), + ...Object.keys(devDependencies) +]; + const define = Object.entries(process.env).reduce( (acc, [key, value]) => ({ ...acc, @@ -32,6 +51,7 @@ const script = await esbuild.build({ banner: { js: "import { createRequire as topLevelCreateRequire } from 'module';\n const require = topLevelCreateRequire(import.meta.url);" }, + external: externalDependencies, define }); diff --git a/src/commands/dev.ts b/src/commands/dev.ts index 314ac11c..0ff0caa7 100644 --- a/src/commands/dev.ts +++ b/src/commands/dev.ts @@ -1,6 +1,7 @@ import {red} from 'kleur'; +import {logHelpDevBuild} from '../help/dev.build.help'; import {logHelpDev} from '../help/dev.help'; -import {build} from '../services/build.services'; +import {build} from '../services/build/build.services'; import {start, stop} from '../services/docker.services'; import {eject} from '../services/eject.services'; @@ -12,7 +13,7 @@ export const dev = async (args?: string[]) => { await eject(); break; case 'build': - await build(); + await build(args); break; case 'start': await start(); @@ -25,3 +26,15 @@ export const dev = async (args?: string[]) => { logHelpDev(); } }; + +export const helpDev = (args?: string[]) => { + const [subCommand] = args ?? []; + + switch (subCommand) { + case 'build': + logHelpDevBuild(args); + break; + default: + logHelpDev(args); + } +}; diff --git a/src/constants/dev.constants.ts b/src/constants/dev.constants.ts index 4825b4d8..c2e82cc5 100644 --- a/src/constants/dev.constants.ts +++ b/src/constants/dev.constants.ts @@ -8,9 +8,24 @@ export const DEVELOPER_PROJECT_SATELLITE_DECLARATIONS_PATH = join( 'satellite' ); +export const DEVELOPER_PROJECT_SATELLITE_CARGO_TOML = join( + DEVELOPER_PROJECT_SATELLITE_PATH, + 'Cargo.toml' +); +export const DEVELOPER_PROJECT_SATELLITE_INDEX_TS = join( + DEVELOPER_PROJECT_SATELLITE_PATH, + 'index.ts' +); +export const DEVELOPER_PROJECT_SATELLITE_INDEX_MJS = join( + DEVELOPER_PROJECT_SATELLITE_PATH, + 'index.mjs' +); + export const TEMPLATE_PATH = '../templates/eject'; export const TEMPLATE_SATELLITE_PATH = join(TEMPLATE_PATH, 'src', 'satellite'); export const RUST_MIN_VERSION = '1.70.0'; export const IC_WASM_MIN_VERSION = '0.8.5'; export const DOCKER_MIN_VERSION = '24.0.0'; + +export const DEPLOY_LOCAL_REPLICA_PATH = join(process.cwd(), 'target', 'deploy'); diff --git a/src/help/dev.build.help.ts b/src/help/dev.build.help.ts new file mode 100644 index 00000000..470020bd --- /dev/null +++ b/src/help/dev.build.help.ts @@ -0,0 +1,38 @@ +import {cyan, green, magenta, yellow} from 'kleur'; +import {helpOutput} from './common.help'; +import {TITLE} from './help'; + +export const DEV_BUILD_DESCRIPTION = 'Build your serverless functions.'; + +export const helpDevBuild = `${magenta('build')} ${DEV_BUILD_DESCRIPTION}`; + +const usage = `Usage: ${green('juno')} ${cyan('dev')} ${magenta('build')} ${yellow('[options]')} + +Options: + ${yellow('-l, --lang')} Specify the language for building the serverless functions: ${magenta('rust')}, ${magenta('typescript')} or ${magenta('javascript')}. + ${yellow('-p, --path')} Path to the source to bundle. + ${yellow('-h, --help')} Output usage information. + +Notes: + +- If no language is provided, the CLI attempts to determine the appropriate build. +- Language can be shortened to ${magenta('rs')} for Rust, ${magenta('ts')} for TypeScript and ${magenta('js')} for JavaScript. +- The path option maps to ${magenta('--manifest-path')} for Rust (Cargo) or to the source file for TypeScript and JavaScript (e.g. ${magenta('index.ts')} or ${magenta('index.mjs')}) .`; + +const doc = `${DEV_BUILD_DESCRIPTION} + +\`\`\`bash +${usage} +\`\`\` +`; + +const help = `${TITLE} + +${DEV_BUILD_DESCRIPTION} + +${usage} +`; + +export const logHelpDevBuild = (args?: string[]) => { + console.log(helpOutput(args) === 'doc' ? doc : help); +}; diff --git a/src/help/dev.help.ts b/src/help/dev.help.ts index 12234e56..5058e060 100644 --- a/src/help/dev.help.ts +++ b/src/help/dev.help.ts @@ -1,11 +1,11 @@ -import {cyan, green, magenta} from 'kleur'; +import {cyan, green, magenta, yellow} from 'kleur'; import {helpOutput} from './common.help'; +import {helpDevBuild} from './dev.build.help'; import {TITLE} from './help'; export const DEV_DESCRIPTION = 'Handle development tasks like building serverless functions or running a local Internet Computer instance.'; -const helpDevBuild = `${magenta('build')} Build your serverless functions.`; const helpDevStart = `${magenta( 'start' )} Start a local Internet Computer network in a container.`; @@ -13,7 +13,7 @@ const helpDevStart = `${magenta( export const helpDevContinue = `${helpDevBuild} ${helpDevStart}`; -const usage = `Usage: ${green('juno')} ${cyan('dev')} ${magenta('')} +const usage = `Usage: ${green('juno')} ${cyan('dev')} ${magenta('')} ${yellow('[options]')} Subcommands: ${helpDevBuild} diff --git a/src/index.ts b/src/index.ts index ae58f6d6..0237ff06 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ import {login, logout} from './commands/auth'; import {clear} from './commands/clear'; import {config} from './commands/config'; import {deploy} from './commands/deploy'; -import {dev} from './commands/dev'; +import {dev, helpDev} from './commands/dev'; import {init} from './commands/init'; import {open} from './commands/open'; import {snapshot} from './commands/snapshot'; @@ -16,7 +16,6 @@ import {whoami} from './commands/whoami'; import {logHelpClear} from './help/clear.help'; import {logHelpConfig} from './help/config.help'; import {logHelpDeploy} from './help/deploy.help'; -import {logHelpDev} from './help/dev.help'; import {help} from './help/help'; import {logHelpInit} from './help/init.help'; import {logHelpLogin} from './help/login.help'; @@ -81,7 +80,7 @@ export const run = async () => { logHelpDeploy(args); break; case 'dev': - logHelpDev(args); + helpDev(args); break; case 'snapshot': logHelpSnapshot(args); diff --git a/src/services/build/build.javascript.ts b/src/services/build/build.javascript.ts new file mode 100644 index 00000000..0eec7432 --- /dev/null +++ b/src/services/build/build.javascript.ts @@ -0,0 +1,64 @@ +import {buildEsm} from '@junobuild/cli-tools'; +import {red, yellow} from 'kleur'; +import {mkdir} from 'node:fs/promises'; +import {join} from 'node:path'; +import { + DEPLOY_LOCAL_REPLICA_PATH, + DEVELOPER_PROJECT_SATELLITE_PATH +} from '../../constants/dev.constants'; + +export const buildTypeScript = async ({path}: {path?: string | undefined} = {}) => { + await build({lang: 'ts', path}); +}; + +export const buildJavaScript = async ({path}: {path?: string | undefined} = {}) => { + await build({lang: 'js', path}); +}; + +const build = async ({lang, path}: {lang: 'ts' | 'js'; path?: string | undefined}) => { + // Create output target/deploy if it does not yet exist. + await mkdir(DEPLOY_LOCAL_REPLICA_PATH, {recursive: true}); + + const infile = + path ?? join(DEVELOPER_PROJECT_SATELLITE_PATH, lang === 'js' ? 'index.mjs' : 'index.ts'); + + const outfile = join(DEPLOY_LOCAL_REPLICA_PATH, 'index.mjs'); + + const {metafile, errors, warnings, version} = await buildEsm({ + infile, + outfile + }); + + for (const {text} of warnings) { + console.log(`${yellow('[Warn]')} ${text}`); + } + + for (const {text} of errors) { + console.log(`${red('[Error]')} ${text}`); + } + + if (errors.length > 0) { + process.exit(1); + } + + const entry = Object.entries(metafile.outputs); + + if (entry.length === 0) { + console.log(red('Unexpected: No metafile resulting from the build was found.')); + process.exit(1); + } + + const [key, {bytes}] = entry[0]; + + const unit = bytes >= 1000 ? 'megabyte' : 'kilobyte'; + + const formatter = new Intl.NumberFormat('en', { + style: 'unit', + unit + }); + + console.log(`✅ Build complete (esbuild ${version}).`); + console.log( + `➡️ ${key} (${formatter.format(bytes / (unit === 'megabyte' ? 1_000_000 : 1_000))})` + ); +}; diff --git a/src/services/build.services.ts b/src/services/build/build.rust.services.ts similarity index 93% rename from src/services/build.services.ts rename to src/services/build/build.rust.services.ts index 5aad1e88..88155380 100644 --- a/src/services/build.services.ts +++ b/src/services/build/build.rust.services.ts @@ -1,3 +1,4 @@ +import {nonNullish} from '@dfinity/utils'; import {execute, gzipFile, spawn} from '@junobuild/cli-tools'; import {generateApi} from '@junobuild/did-tools'; import {green, grey, magenta, yellow} from 'kleur'; @@ -5,21 +6,21 @@ import {existsSync} from 'node:fs'; import {lstat, mkdir, readFile, rename, writeFile} from 'node:fs/promises'; import {join, relative} from 'node:path'; import ora, {type Ora} from 'ora'; -import {detectJunoDevConfigType} from '../configs/juno.dev.config'; +import {detectJunoDevConfigType} from '../../configs/juno.dev.config'; import { + DEPLOY_LOCAL_REPLICA_PATH, DEVELOPER_PROJECT_SATELLITE_DECLARATIONS_PATH, DEVELOPER_PROJECT_SATELLITE_PATH, IC_WASM_MIN_VERSION -} from '../constants/dev.constants'; -import {readSatelliteDid} from '../utils/did.utils'; -import {checkCargoBinInstalled, checkIcWasmVersion, checkRustVersion} from '../utils/env.utils'; -import {confirmAndExit} from '../utils/prompt.utils'; +} from '../../constants/dev.constants'; +import {readSatelliteDid} from '../../utils/did.utils'; +import {checkCargoBinInstalled, checkIcWasmVersion, checkRustVersion} from '../../utils/env.utils'; +import {confirmAndExit} from '../../utils/prompt.utils'; const CARGO_RELEASE_DIR = join(process.cwd(), 'target', 'wasm32-unknown-unknown', 'release'); -const DEPLOY_DIR = join(process.cwd(), 'target', 'deploy'); -const SATELLITE_OUTPUT = join(DEPLOY_DIR, 'satellite.wasm'); +const SATELLITE_OUTPUT = join(DEPLOY_LOCAL_REPLICA_PATH, 'satellite.wasm'); -export const build = async () => { +export const buildRust = async ({path}: {path?: string | undefined} = {}) => { const {valid: validRust} = await checkRustVersion(); if (validRust === 'error' || !validRust) { @@ -44,12 +45,13 @@ export const build = async () => { return; } + const defaultProjectArgs = ['-p', 'satellite']; + const args = [ 'build', '--target', 'wasm32-unknown-unknown', - '-p', - 'satellite', + ...(nonNullish(path) ? ['--manifest-path', path] : defaultProjectArgs), '--release', ...(existsSync('Cargo.lock') ? ['--locked'] : []) ]; @@ -214,7 +216,7 @@ const api = async () => { }; const icWasm = async () => { - await mkdir(DEPLOY_DIR, {recursive: true}); + await mkdir(DEPLOY_LOCAL_REPLICA_PATH, {recursive: true}); // Remove unused functions and debug info. await spawn({ diff --git a/src/services/build/build.services.ts b/src/services/build/build.services.ts new file mode 100644 index 00000000..3ac5f5bc --- /dev/null +++ b/src/services/build/build.services.ts @@ -0,0 +1,79 @@ +import {nonNullish} from '@dfinity/utils'; +import {nextArg} from '@junobuild/cli-tools'; +import {red} from 'kleur'; +import {existsSync} from 'node:fs'; +import {basename, extname} from 'node:path'; +import { + DEVELOPER_PROJECT_SATELLITE_CARGO_TOML, + DEVELOPER_PROJECT_SATELLITE_INDEX_MJS, + DEVELOPER_PROJECT_SATELLITE_INDEX_TS +} from '../../constants/dev.constants'; +import {buildJavaScript, buildTypeScript} from './build.javascript'; +import {buildRust} from './build.rust.services'; + +export const build = async (args?: string[]) => { + const path = nextArg({args, option: '-p'}) ?? nextArg({args, option: '--path'}); + + const lang = nextArg({args, option: '-l'}) ?? nextArg({args, option: '--lang'}); + + // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check + switch (lang?.toLowerCase()) { + case 'rs': + case 'rust': + await buildRust({path}); + return; + case 'ts': + case 'typescript': + await buildTypeScript({path}); + return; + case 'js': + case 'javascript': + await buildJavaScript({path}); + return; + } + + const isPathToml = + nonNullish(path) && basename(path) === basename(DEVELOPER_PROJECT_SATELLITE_CARGO_TOML); + + if (isPathToml) { + await buildRust({path}); + return; + } + + const isPathTypeScript = + nonNullish(path) && extname(path) === extname(DEVELOPER_PROJECT_SATELLITE_INDEX_TS); + + if (isPathTypeScript) { + await buildTypeScript({path}); + return; + } + + const isPathJavaScript = + nonNullish(path) && extname(path) === extname(DEVELOPER_PROJECT_SATELLITE_INDEX_MJS); + + if (isPathJavaScript) { + await buildJavaScript({path}); + return; + } + + if (existsSync(DEVELOPER_PROJECT_SATELLITE_CARGO_TOML)) { + await buildRust(); + return; + } + + if (existsSync(DEVELOPER_PROJECT_SATELLITE_INDEX_TS)) { + await buildTypeScript(); + return; + } + + if (existsSync(DEVELOPER_PROJECT_SATELLITE_INDEX_MJS)) { + await buildJavaScript(); + return; + } + + console.log( + red( + 'No source found for Satellite serverless functions. Expected a Rust, TypeScript, or JavaScript project.' + ) + ); +};