From c0b9b5d205a4cfde43a294993ee673aa842efb07 Mon Sep 17 00:00:00 2001 From: Bartosz Prusinowski Date: Wed, 20 Aug 2025 13:36:06 +0200 Subject: [PATCH 01/11] chore: Add @google/genai --- app/package.json | 1 + yarn.lock | 223 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 192 insertions(+), 32 deletions(-) diff --git a/app/package.json b/app/package.json index 7d4018a2e6..10d96c3bf4 100644 --- a/app/package.json +++ b/app/package.json @@ -26,6 +26,7 @@ "@dnd-kit/utilities": "3.2.2", "@emotion/react": "^11.8.2", "@emotion/styled": "^11.8.1", + "@google/genai": "^1.15.0", "@graphql-tools/schema": "^7.1.5", "@interactivethings/swiss-federal-ci": "^3.1.0", "@juggle/resize-observer": "^3.4.0", diff --git a/yarn.lock b/yarn.lock index b9a10cac65..ce350f1d74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -311,7 +311,29 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.2.tgz#4183f9e642fd84e74e3eea7ffa93a412e3b102c9" integrity sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ== -"@babel/core@7.12.9", "@babel/core@^7.0.0", "@babel/core@^7.10.5", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.14.6", "@babel/core@^7.18.9", "@babel/core@^7.23.0", "@babel/core@^7.24.4", "@babel/core@^7.26.10", "@babel/core@^7.7.7": +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.0.0", "@babel/core@^7.10.5", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.18.9", "@babel/core@^7.23.0", "@babel/core@^7.24.4", "@babel/core@^7.26.10", "@babel/core@^7.7.7": version "7.28.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.0.tgz#55dad808d5bf3445a108eefc88ea3fdf034749a4" integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== @@ -341,6 +363,17 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.12.5", "@babel/generator@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.3.tgz#9626c1741c650cbac39121694a0f2d7451b8ef3e" + integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== + dependencies: + "@babel/parser" "^7.28.3" + "@babel/types" "^7.28.2" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + "@babel/generator@^7.20.14": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" @@ -704,6 +737,15 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" +"@babel/helper-module-transforms@^7.12.1": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" + integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.28.3" + "@babel/helper-module-transforms@^7.14.5": version "7.15.8" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz" @@ -1005,13 +1047,13 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.3.tgz#387d65d279290e22fe7a47a8ffcd2d0c0184edd0" - integrity sha512-h/eKy9agOya1IGuLaZ9tEUgz+uIRXcbtOhRtUyyMf8JFmn1iT13vnl/IGVWSkdOCG/pC57U4S1jnAabAavTMwg== +"@babel/helpers@^7.12.5": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.3.tgz#b83156c0a2232c133d1b535dd5d3452119c7e441" + integrity sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw== dependencies: "@babel/template" "^7.27.2" - "@babel/types" "^7.27.3" + "@babel/types" "^7.28.2" "@babel/helpers@^7.27.6": version "7.28.2" @@ -1058,13 +1100,25 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@7.12.16", "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.6", "@babel/parser@^7.15.4", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0", "@babel/parser@^7.24.4", "@babel/parser@^7.24.5", "@babel/parser@^7.25.9", "@babel/parser@^7.26.2", "@babel/parser@^7.27.0", "@babel/parser@^7.27.1", "@babel/parser@^7.27.2", "@babel/parser@^7.27.3", "@babel/parser@^7.28.0": +"@babel/parser@7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4" + integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw== + +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.15.4", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0", "@babel/parser@^7.24.4", "@babel/parser@^7.24.5", "@babel/parser@^7.25.9", "@babel/parser@^7.26.2", "@babel/parser@^7.27.0", "@babel/parser@^7.27.1", "@babel/parser@^7.27.2", "@babel/parser@^7.27.3", "@babel/parser@^7.28.0": version "7.28.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== dependencies: "@babel/types" "^7.28.0" +"@babel/parser@^7.12.7", "@babel/parser@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.3.tgz#d2d25b814621bca5fe9d172bc93792547e7a2a71" + integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA== + dependencies: + "@babel/types" "^7.28.2" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" @@ -2256,6 +2310,15 @@ resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.26.10.tgz#1fce13e5a331a9dafff192b5db41350d72d44bed" integrity sha512-AYXK0hLWfEaK9WAePJqs30qro09a8w7X3YZzjukqtLXreE7xBZYdi5EMrP87T4UrVqmQ9tIX6L6SeTu5LDh3zw== +"@babel/template@^7.12.7", "@babel/template@^7.27.1", "@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + "@babel/template@^7.15.4": version "7.15.4" resolved "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz" @@ -2301,15 +2364,6 @@ "@babel/parser" "^7.27.0" "@babel/types" "^7.27.0" -"@babel/template@^7.27.1", "@babel/template@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" - integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" - "@babel/types" "^7.27.1" - "@babel/traverse@7.12.13": version "7.12.13" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz" @@ -2340,6 +2394,19 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.12.9", "@babel/traverse@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.3.tgz#6911a10795d2cce43ec6a28cffc440cca2593434" + integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.3" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.3" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.2" + debug "^4.3.1" + "@babel/traverse@^7.18.9": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" @@ -2454,6 +2521,14 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" +"@babel/types@^7.12.7", "@babel/types@^7.28.2": + version "7.28.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" + integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/types@^7.16.7": version "7.17.0" resolved "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz" @@ -2556,14 +2631,6 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" -"@babel/types@^7.28.2": - version "7.28.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" - integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@bergos/jsonparse@^1.4.0": version "1.4.1" resolved "https://registry.yarnpkg.com/@bergos/jsonparse/-/jsonparse-1.4.1.tgz#560e7125f65d0ad6b96dfe1c0d5da3115b9f8c59" @@ -3992,6 +4059,14 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@google/genai@^1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@google/genai/-/genai-1.15.0.tgz#0eab6dbc1a7c29a8a7b8c509b615524b48fce1cf" + integrity sha512-4CSW+hRTESWl3xVtde7pkQ3E+dDFhDq+m4ztmccRctZfx1gKy3v0M9STIMGk6Nq0s6O2uKMXupOZQ1JGorXVwQ== + dependencies: + google-auth-library "^9.14.2" + ws "^8.18.0" + "@graphql-codegen/cli@^1.19.4": version "1.21.5" resolved "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-1.21.5.tgz" @@ -11385,7 +11460,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.1.2, base64-js@^1.3.1: +base64-js@^1.1.2, base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -11416,6 +11491,11 @@ big.js@^5.2.2: resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bignumber.js@^9.0.0: + version "9.3.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" + integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" @@ -11686,7 +11766,7 @@ buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== -buffer-equal-constant-time@1.0.1: +buffer-equal-constant-time@1.0.1, buffer-equal-constant-time@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= @@ -14056,7 +14136,7 @@ easy-table@1.2.0: optionalDependencies: wcwidth "^1.0.1" -ecdsa-sig-formatter@1.0.11: +ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: version "1.0.11" resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== @@ -15087,7 +15167,7 @@ extend-shallow@^3.0.0: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0: +extend@^3.0.0, extend@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -15706,7 +15786,27 @@ fwd-stream@^1.0.4: dependencies: readable-stream "~1.0.26-4" -gensync@^1.0.0-beta.2: +gaxios@^6.0.0, gaxios@^6.1.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.7.1.tgz#ebd9f7093ede3ba502685e73390248bb5b7f71fb" + integrity sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ== + dependencies: + extend "^3.0.2" + https-proxy-agent "^7.0.1" + is-stream "^2.0.0" + node-fetch "^2.6.9" + uuid "^9.0.1" + +gcp-metadata@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.1.tgz#f65aa69f546bc56e116061d137d3f5f90bdec494" + integrity sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A== + dependencies: + gaxios "^6.1.1" + google-logging-utils "^0.0.2" + json-bigint "^1.0.0" + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -16104,6 +16204,23 @@ goober@^2.0.33: resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd" integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== +google-auth-library@^9.14.2: + version "9.15.1" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.15.1.tgz#0c5d84ed1890b2375f1cd74f03ac7b806b392928" + integrity sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng== + dependencies: + base64-js "^1.3.0" + ecdsa-sig-formatter "^1.0.11" + gaxios "^6.1.1" + gcp-metadata "^6.1.0" + gtoken "^7.0.0" + jws "^4.0.0" + +google-logging-utils@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/google-logging-utils/-/google-logging-utils-0.0.2.tgz#5fd837e06fa334da450433b9e3e1870c1594466a" + integrity sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ== + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -16245,6 +16362,14 @@ graphql@^15.5.1: resolved "https://registry.npmjs.org/graphql/-/graphql-15.5.1.tgz" integrity sha512-FeTRX67T3LoE3LWAxxOlW2K3Bz+rMYAC18rRguK4wgXaTZMiJwSUwDmPFo3UadAKbzirKIg5Qy+sNJXbpPRnQw== +gtoken@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.1.0.tgz#d61b4ebd10132222817f7222b1e6064bd463fc26" + integrity sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw== + dependencies: + gaxios "^6.0.0" + jws "^4.0.0" + gunzip-maybe@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz#b913564ae3be0eda6f3de36464837a9cd94b98ac" @@ -16752,7 +16877,7 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^7.0.6: +https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== @@ -17938,6 +18063,13 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + json-buffer@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" @@ -18194,6 +18326,15 @@ jwa@^1.4.1: ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" +jwa@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" + integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== + dependencies: + buffer-equal-constant-time "^1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + jws@^3.2.2: version "3.2.2" resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" @@ -18202,6 +18343,14 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +jws@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" + integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== + dependencies: + jwa "^2.0.0" + safe-buffer "^5.0.1" + kdbush@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-4.0.2.tgz#2f7b7246328b4657dd122b6c7f025fbc2c868e39" @@ -20152,7 +20301,7 @@ node-fetch@2.6.1, node-fetch@^2.6.1: resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@^2.0.0: +node-fetch@^2.0.0, node-fetch@^2.6.9: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -22805,7 +22954,7 @@ resolve@^1.12.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.13.1, resolve@^1.22.4, resolve@^1.22.8: +resolve@^1.13.1, resolve@^1.22.4, resolve@^1.22.8, resolve@^1.3.2: version "1.22.10" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== @@ -23176,6 +23325,11 @@ semver-compare@^1.0.0: resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@^5.4.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" @@ -25478,6 +25632,11 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" From f3e6c3d96cd8fbb68bb57f4765aecba18710e0b0 Mon Sep 17 00:00:00 2001 From: Bartosz Prusinowski Date: Wed, 20 Aug 2025 15:38:00 +0200 Subject: [PATCH 02/11] chore: Update .env files --- .env.example | 3 +++ app/.env.development | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 8880d8f554..5ede9de3b5 100644 --- a/.env.example +++ b/.env.example @@ -14,3 +14,6 @@ NEXT_PUBLIC_MAPTILER_STYLE_KEY=123 # SEO PREVENT_SEARCH_BOTS=false + +# AI +GEMINI_API_KEY= \ No newline at end of file diff --git a/app/.env.development b/app/.env.development index 8b27fc6672..c3eecc5658 100644 --- a/app/.env.development +++ b/app/.env.development @@ -7,4 +7,5 @@ SENTRY_IGNORE_API_RESOLUTION_ERROR=1 NEXT_PUBLIC_VECTOR_TILE_URL=https://world.vectortiles.geo.admin.ch NEXT_PUBLIC_MAPTILER_STYLE_KEY=123 ADFS_PROFILE_URL=https://www.myaccount-r.eiam.admin.ch/ -NEXTAUTH_URL=https://localhost:3000 \ No newline at end of file +NEXTAUTH_URL=https://localhost:3000 +GEMINI_API_KEY=123 \ No newline at end of file From a5a27204827c500b42ad8fcdebe94787e3480ead Mon Sep 17 00:00:00 2001 From: Bartosz Prusinowski Date: Wed, 20 Aug 2025 15:38:53 +0200 Subject: [PATCH 03/11] feat: Allow passing toolbarEndSlot to MarkdownInput --- app/components/form.tsx | 48 +++++++++++++++++---------- app/configurator/components/field.tsx | 3 ++ 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/app/components/form.tsx b/app/components/form.tsx index 901a4f36bd..76e0fb3acc 100644 --- a/app/components/form.tsx +++ b/app/components/form.tsx @@ -583,6 +583,7 @@ export const MarkdownInput = ({ disablePlugins, disableToolbar, characterLimit, + toolbarEndSlot, }: { label?: string | ReactNode; characterLimit?: number; @@ -595,6 +596,7 @@ export const MarkdownInput = ({ listToggles?: boolean; link?: boolean; }; + toolbarEndSlot?: ReactNode; } & FieldProps) => { const classes = useMarkdownInputStyles(); const [characterLimitReached, setCharacterLimitReached] = useState(false); @@ -618,24 +620,34 @@ export const MarkdownInput = ({ toolbarPlugin({ toolbarClassName: classes.toolbar, toolbarContents: () => ( -
- - {disableToolbar?.textStyles ? null : ( - - )} - {disableToolbar?.blockType ? null : } - {disableToolbar?.listToggles ? null : ( - <> - - - - )} - {disableToolbar?.link ? null : ( - <> - - - - )} +
+ + + {disableToolbar?.textStyles ? null : ( + + )} + {disableToolbar?.blockType ? null : } + {disableToolbar?.listToggles ? null : ( + <> + + + + )} + {disableToolbar?.link ? null : ( + <> + + + + )} + + {toolbarEndSlot} {label && name ? : null}
diff --git a/app/configurator/components/field.tsx b/app/configurator/components/field.tsx index 5e5e680369..28be427c49 100644 --- a/app/configurator/components/field.tsx +++ b/app/configurator/components/field.tsx @@ -616,6 +616,7 @@ export const MetaInputField = ({ locale, value, disableToolbar, + toolbarEndSlot, }: { type: "chart" | "layout"; inputType: "text" | "markdown"; @@ -624,6 +625,7 @@ export const MetaInputField = ({ locale: string; value?: string; disableToolbar?: ComponentProps["disableToolbar"]; + toolbarEndSlot?: ComponentProps["toolbarEndSlot"]; }) => { const field = useMetaField({ type, metaKey, locale, value }); @@ -636,6 +638,7 @@ export const MetaInputField = ({ label={label} {...field} disableToolbar={disableToolbar} + toolbarEndSlot={toolbarEndSlot} /> ); default: From dfb7e82ce1a98a834f52c0aadd1150fb22930b7f Mon Sep 17 00:00:00 2001 From: Bartosz Prusinowski Date: Wed, 20 Aug 2025 15:45:37 +0200 Subject: [PATCH 04/11] fix: Re-mount on external trigger --- app/components/form.tsx | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/app/components/form.tsx b/app/components/form.tsx index 76e0fb3acc..98ac980521 100644 --- a/app/components/form.tsx +++ b/app/components/form.tsx @@ -49,6 +49,7 @@ import { RefObject, SyntheticEvent, useCallback, + useEffect, useMemo, useRef, useState, @@ -601,6 +602,16 @@ export const MarkdownInput = ({ const classes = useMarkdownInputStyles(); const [characterLimitReached, setCharacterLimitReached] = useState(false); const { headings: disableHeadings } = disablePlugins ?? {}; + const [markdown, setMarkdown] = useState(value ? `${value}` : ""); + const [editorKey, setEditorKey] = useState(0); + + useEffect(() => { + const incoming = value ? `${value}` : ""; + if (incoming !== markdown) { + setMarkdown(incoming); + setEditorKey((k) => k + 1); + } + }, [markdown, value]); const handleMaxLengthReached = useEvent( ({ reachedMaxLength }: { reachedMaxLength: boolean }) => { @@ -611,11 +622,12 @@ export const MarkdownInput = ({ return (
{ + const v = newValue + // Remove backslashes from the string, as they are not supported in react-markdown + .replaceAll("\\", "") + // is not supported in react-markdown we use for rendering. + .replaceAll("", "") + .replace("", "") + .replaceAll("\\", ""); + + setMarkdown(v); onChange?.({ currentTarget: { - value: newValue - // Remove backslashes from the string, as they are not supported in react-markdown - .replaceAll("\\", "") - // is not supported in react-markdown we use for rendering. - .replaceAll("", "") - .replace("", ""), + value: v, }, } as any); }} From ac53dc7147c96cd2600e60bd0889fa4d4be6f734 Mon Sep 17 00:00:00 2001 From: Bartosz Prusinowski Date: Wed, 20 Aug 2025 15:45:56 +0200 Subject: [PATCH 05/11] feat: Set up Gemini Gen AI client --- app/server/ai/client.ts | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 app/server/ai/client.ts diff --git a/app/server/ai/client.ts b/app/server/ai/client.ts new file mode 100644 index 0000000000..b7bc8182a8 --- /dev/null +++ b/app/server/ai/client.ts @@ -0,0 +1,3 @@ +import { GoogleGenAI } from "@google/genai"; + +export const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY }); From 21af6c085f58c0ad853b5339d1e24e239e236a63 Mon Sep 17 00:00:00 2001 From: Bartosz Prusinowski Date: Wed, 20 Aug 2025 15:46:08 +0200 Subject: [PATCH 06/11] feat: Add Gemini utils --- app/server/ai/utils.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 app/server/ai/utils.ts diff --git a/app/server/ai/utils.ts b/app/server/ai/utils.ts new file mode 100644 index 0000000000..954a4c2346 --- /dev/null +++ b/app/server/ai/utils.ts @@ -0,0 +1,23 @@ +import type { Locale } from "@/locales/locales"; + +import type { GenerateContentResponse } from "@google/genai"; + +export const getLanguageName = (locale: Locale) => { + switch (locale) { + case "de": + return "German"; + case "fr": + return "French"; + case "it": + return "Italian"; + case "en": + return "English"; + default: + const _exhaustiveCheck: never = locale; + return _exhaustiveCheck; + } +}; + +export const extractText = (res: GenerateContentResponse): string => { + return res.text ?? res.candidates?.[0]?.content?.parts?.[0]?.text ?? ""; +}; From e475fbca16e585dd27252571ab8496df52bcfcce Mon Sep 17 00:00:00 2001 From: Bartosz Prusinowski Date: Wed, 20 Aug 2025 15:48:59 +0200 Subject: [PATCH 07/11] feat: Add generateMeta utils and API route --- app/pages/api/ai/generate-meta.ts | 26 +++++++++++++ app/server/ai/generate-meta.ts | 61 +++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 app/pages/api/ai/generate-meta.ts create mode 100644 app/server/ai/generate-meta.ts diff --git a/app/pages/api/ai/generate-meta.ts b/app/pages/api/ai/generate-meta.ts new file mode 100644 index 0000000000..90b2021488 --- /dev/null +++ b/app/pages/api/ai/generate-meta.ts @@ -0,0 +1,26 @@ +import { CompactAIContext } from "@/ai/context"; +import { Locale } from "@/locales/locales"; +import { generateMeta } from "@/server/ai/generate-meta"; +import { api } from "@/server/nextkit"; + +type Body = { + field: "title" | "description"; + locale: Locale; + context: CompactAIContext; +}; + +const route = api({ + POST: async ({ req }) => { + if (!process.env.GEMINI_API_KEY) { + return { status: 500, message: "GEMINI_API_KEY is missing" } as const; + } + + const body = req.body as Body; + const { field, locale, context } = body; + const text = await generateMeta({ field, locale, context }); + + return { text }; + }, +}); + +export default route; diff --git a/app/server/ai/generate-meta.ts b/app/server/ai/generate-meta.ts new file mode 100644 index 0000000000..1b91a43351 --- /dev/null +++ b/app/server/ai/generate-meta.ts @@ -0,0 +1,61 @@ +import { CompactAIContext } from "@/ai/context"; +import type { Locale } from "@/locales/locales"; +import { ai } from "@/server/ai/client"; +import { extractText, getLanguageName } from "@/server/ai/utils"; + +export const generateMeta = async ({ + field, + locale, + context, +}: { + field: "title" | "description"; + locale: Locale; + context: CompactAIContext; +}) => { + const systemInstruction = getSystemInstruction({ field, locale }); + const prompt = `Context (JSON):\n${JSON.stringify(context)}`; + const result = await ai.models.generateContent({ + model: "gemini-2.5-flash", + contents: [{ role: "user", parts: [{ text: prompt }] }], + config: { + systemInstruction, + temperature: 0.2, + }, + }); + + return extractText(result); +}; + +const getSystemInstruction = ({ + field, + locale, +}: { + field: "title" | "description"; + locale: Locale; +}) => { + const systemInstructions = [ + `You write a concise visualization ${field} in ${getLanguageName(locale)}.`, + `Do not use markdown, quotes or lists. Return only the ${field} text.`, + `The journal you write for is a very serious, Swiss one, so do not make it too light-hearted or funny, but professional.`, + ]; + + switch (field) { + case "title": + systemInstructions.push(` + It needs to read like a good article headline, highlighting the most important information or insight from the context. + It can not be in the style of "Number of X in Y" - remember, make it insightful and interesting! + `); + break; + case "description": + systemInstructions.push(` + Make it around 2-3 short sentences - clear, factual, and helpful for a general audience. + Remember to highlight the most important trends, patterns, or insights from the context. + `); + break; + default: + const _exhaustiveCheck: never = field; + return _exhaustiveCheck; + } + + return systemInstructions.join("\n"); +}; From 5c04661a949aa172f25e0bd774fa111c8159699c Mon Sep 17 00:00:00 2001 From: Bartosz Prusinowski Date: Wed, 20 Aug 2025 15:50:10 +0200 Subject: [PATCH 08/11] feat: Add useChartAIContext --- app/ai/use-chart-ai-context.ts | 171 ++++++++++++++++++++++++++++++ app/pages/api/ai/generate-meta.ts | 4 +- app/server/ai/generate-meta.ts | 4 +- 3 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 app/ai/use-chart-ai-context.ts diff --git a/app/ai/use-chart-ai-context.ts b/app/ai/use-chart-ai-context.ts new file mode 100644 index 0000000000..b484d84f4e --- /dev/null +++ b/app/ai/use-chart-ai-context.ts @@ -0,0 +1,171 @@ +import { + extractChartConfigUsedComponents, + useQueryFilters, +} from "@/charts/shared/chart-helpers"; +import { ChartConfig, ChartType } from "@/config-types"; +import { getChartConfig } from "@/config-utils"; +import { + hasChartConfigs, + useConfiguratorState, +} from "@/configurator/configurator-state"; +import { ObservationValue } from "@/domain/data"; +import { + useDataCubesComponentsQuery, + useDataCubesMetadataQuery, + useDataCubesObservationsQuery, +} from "@/graphql/hooks"; +import { ComponentId } from "@/graphql/make-component-id"; +import { DataCubeObservationFilter } from "@/graphql/query-hooks"; +import { useLocale } from "@/locales/use-locale"; + +type Dimension = { + id: ComponentId; + label: string; +}; + +type Measure = { + id: ComponentId; + label: string; +}; + +type Observations = { + columns: string[]; + values: ObservationValue[][]; + rowCount: number; + truncated: boolean; +}; + +type DatasetMetadata = { + iri: string; + title: string; + description: string; + datePublished: string; + themes: string[]; +}; + +export type ChartAIContext = { + chartType: ChartType; + datasets: DatasetMetadata[]; + filters: DataCubeObservationFilter[]; + fields: ChartConfig["fields"]; + dimensions: Dimension[]; + measures: Measure[]; + observations: Observations; +}; + +export const useChartAIContext = (): ChartAIContext => { + const locale = useLocale(); + const [state] = useConfiguratorState(hasChartConfigs); + const chartConfig = getChartConfig(state); + const commonQueryVariables = { + sourceType: state.dataSource.type, + sourceUrl: state.dataSource.url, + locale, + } as const; + + const [{ data: metadataData }] = useDataCubesMetadataQuery({ + variables: { + ...commonQueryVariables, + cubeFilters: chartConfig.cubes.map((cube) => ({ iri: cube.iri })), + }, + }); + + const [{ data: componentsData }] = useDataCubesComponentsQuery({ + chartConfig, + variables: { + ...commonQueryVariables, + cubeFilters: chartConfig.cubes.map((cube) => ({ + iri: cube.iri, + joinBy: cube.joinBy, + })), + }, + keepPreviousData: true, + }); + + const queryFilters = useQueryFilters({ + chartConfig, + dashboardFilters: state.dashboardFilters, + }); + + const [{ data: observationsData }] = useDataCubesObservationsQuery({ + chartConfig, + variables: { + ...commonQueryVariables, + cubeFilters: queryFilters, + }, + keepPreviousData: true, + }); + + const datasets = metadataData?.dataCubesMetadata ?? []; + const dimensions = componentsData?.dataCubesComponents.dimensions ?? []; + const measures = componentsData?.dataCubesComponents.measures ?? []; + const observations = observationsData?.dataCubesObservations?.data ?? []; + + const dimensionSummaries: Dimension[] = dimensions.map((d) => { + return { + id: d.id, + label: d.label ?? "", + }; + }); + + const measureSummaries: Measure[] = measures.map((m) => ({ + id: m.id, + label: m.label ?? "", + })); + + const maxRows = 200; + const rowCount = observations.length; + const indices = Array.from({ length: rowCount }, (_, i) => i); + + for (let i = indices.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [indices[i], indices[j]] = [indices[j], indices[i]]; + } + const sampledSet = new Set(indices.slice(0, Math.min(maxRows, rowCount))); + const truncated = rowCount > maxRows; + const rows = observations.filter((_, idx) => sampledSet.has(idx)); + + const usedDimensionIds = extractChartConfigUsedComponents(chartConfig, { + components: [...dimensions, ...measures], + }).map((d) => d.id); + + const values = rows.map((row) => { + return usedDimensionIds.map((col) => { + const v = row[col]; + return v === undefined ? null : (v as ObservationValue); + }); + }); + + const compact: ChartAIContext = { + chartType: chartConfig.chartType, + datasets: datasets.map((m) => ({ + iri: m.iri, + title: m.title, + description: m.description, + datePublished: m.datePublished ?? "", + themes: (m.themes ?? []).map((t) => t.label ?? ""), + })), + filters: queryFilters, + fields: chartConfig.fields, + dimensions: dimensionSummaries.filter((d) => + usedDimensionIds.includes(d.id) + ), + measures: measureSummaries.filter((m) => usedDimensionIds.includes(m.id)), + observations: + usedDimensionIds.length > 0 + ? { + columns: usedDimensionIds, + values, + rowCount, + truncated, + } + : { + columns: [], + values: [], + rowCount: 0, + truncated: false, + }, + }; + + return compact; +}; diff --git a/app/pages/api/ai/generate-meta.ts b/app/pages/api/ai/generate-meta.ts index 90b2021488..dd893530c1 100644 --- a/app/pages/api/ai/generate-meta.ts +++ b/app/pages/api/ai/generate-meta.ts @@ -1,4 +1,4 @@ -import { CompactAIContext } from "@/ai/context"; +import { ChartAIContext } from "@/ai/use-chart-ai-context"; import { Locale } from "@/locales/locales"; import { generateMeta } from "@/server/ai/generate-meta"; import { api } from "@/server/nextkit"; @@ -6,7 +6,7 @@ import { api } from "@/server/nextkit"; type Body = { field: "title" | "description"; locale: Locale; - context: CompactAIContext; + context: ChartAIContext; }; const route = api({ diff --git a/app/server/ai/generate-meta.ts b/app/server/ai/generate-meta.ts index 1b91a43351..1333416644 100644 --- a/app/server/ai/generate-meta.ts +++ b/app/server/ai/generate-meta.ts @@ -1,4 +1,4 @@ -import { CompactAIContext } from "@/ai/context"; +import { ChartAIContext } from "@/ai/use-chart-ai-context"; import type { Locale } from "@/locales/locales"; import { ai } from "@/server/ai/client"; import { extractText, getLanguageName } from "@/server/ai/utils"; @@ -10,7 +10,7 @@ export const generateMeta = async ({ }: { field: "title" | "description"; locale: Locale; - context: CompactAIContext; + context: ChartAIContext; }) => { const systemInstruction = getSystemInstruction({ field, locale }); const prompt = `Context (JSON):\n${JSON.stringify(context)}`; From 64b56343af2051735aca0d881726308c7eb7ff01 Mon Sep 17 00:00:00 2001 From: Bartosz Prusinowski Date: Wed, 20 Aug 2025 15:52:30 +0200 Subject: [PATCH 09/11] feat: Add GenerateMetaButton --- app/components/ai/generate-meta-button.tsx | 56 ++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 app/components/ai/generate-meta-button.tsx diff --git a/app/components/ai/generate-meta-button.tsx b/app/components/ai/generate-meta-button.tsx new file mode 100644 index 0000000000..0b821d8c6d --- /dev/null +++ b/app/components/ai/generate-meta-button.tsx @@ -0,0 +1,56 @@ +import { t } from "@lingui/macro"; +import { CircularProgress, IconButton, Tooltip } from "@mui/material"; +import { useState } from "react"; + +import { useChartAIContext } from "@/ai/use-chart-ai-context"; +import { Icon } from "@/icons"; +import { Locale } from "@/locales/locales"; +import { useEvent } from "@/utils/use-event"; + +export const GenerateMetaButton = ({ + locale, + field, + onResult, +}: { + locale: Locale; + field: "title" | "description"; + onResult: (value: string) => void; +}) => { + const [loading, setLoading] = useState(false); + const context = useChartAIContext(); + + const handleClick = useEvent(async () => { + try { + setLoading(true); + const response = await fetch("/api/ai/generate-meta", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ field, locale, context }), + }); + const { data } = (await response.json()) as { data: { text: string } }; + + if (data.text) { + onResult(data.text); + } + } finally { + setLoading(false); + } + }); + + const label = + field === "title" + ? t({ id: "ai.generate.title", message: "Generate title" }) + : t({ id: "ai.generate.description", message: "Generate description" }); + + return ( + + + {loading ? ( + + ) : ( + + )} + + + ); +}; From 1a2c6afeb8825be820e131e019792acf3175a3f3 Mon Sep 17 00:00:00 2001 From: Bartosz Prusinowski Date: Wed, 20 Aug 2025 15:52:44 +0200 Subject: [PATCH 10/11] feat: Add GenerateMetaButton to AnnotatorOptions --- .../components/annotator-options.tsx | 18 +++++++++++++++++- app/configurator/components/field.tsx | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/configurator/components/annotator-options.tsx b/app/configurator/components/annotator-options.tsx index 0b5d17d190..09c512a10c 100644 --- a/app/configurator/components/annotator-options.tsx +++ b/app/configurator/components/annotator-options.tsx @@ -1,9 +1,11 @@ import { Box } from "@mui/material"; import { useEffect, useRef } from "react"; +import { GenerateMetaButton } from "@/components/ai/generate-meta-button"; import { Meta } from "@/config-types"; import { getChartConfig } from "@/config-utils"; import { + hasChartConfigs, isAnnotatorField, isConfiguring, isLayouting, @@ -54,7 +56,7 @@ const AnnotatorOptions = ({ activeField: string | undefined; meta: Meta; }) => { - const [_, dispatch] = useConfiguratorState(); + const [_, dispatch] = useConfiguratorState(hasChartConfigs); const orderedLocales = useOrderedLocales(); const panelRef = useRef(null); const handleClosePanel = useEvent(() => { @@ -103,6 +105,20 @@ const AnnotatorOptions = ({ listToggles: activeField === "title", link: activeField === "title", }} + toolbarEndSlot={ + activeField === "label" || type === "layout" ? null : ( + { + dispatch({ + type: "CHART_META_CHANGE", + value: { path: `${activeField}.${locale}`, value }, + }); + }} + /> + ) + } />
))} diff --git a/app/configurator/components/field.tsx b/app/configurator/components/field.tsx index 28be427c49..ca7df91859 100644 --- a/app/configurator/components/field.tsx +++ b/app/configurator/components/field.tsx @@ -622,7 +622,7 @@ export const MetaInputField = ({ inputType: "text" | "markdown"; label: string | ReactNode; metaKey: string; - locale: string; + locale: Locale; value?: string; disableToolbar?: ComponentProps["disableToolbar"]; toolbarEndSlot?: ComponentProps["toolbarEndSlot"]; From f9f6875b78f5b33b963cb64436b1f2290b71f933 Mon Sep 17 00:00:00 2001 From: Bartosz Prusinowski Date: Wed, 20 Aug 2025 15:58:23 +0200 Subject: [PATCH 11/11] chore: yarn.lock --- yarn.lock | 181 +++++++++++++++++++++--------------------------------- 1 file changed, 71 insertions(+), 110 deletions(-) diff --git a/yarn.lock b/yarn.lock index ce350f1d74..d742fcb59f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -311,43 +311,21 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.2.tgz#4183f9e642fd84e74e3eea7ffa93a412e3b102c9" integrity sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ== -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.0.0", "@babel/core@^7.10.5", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.18.9", "@babel/core@^7.23.0", "@babel/core@^7.24.4", "@babel/core@^7.26.10", "@babel/core@^7.7.7": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.0.tgz#55dad808d5bf3445a108eefc88ea3fdf034749a4" - integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== +"@babel/core@7.12.9", "@babel/core@^7.0.0", "@babel/core@^7.10.5", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.14.6", "@babel/core@^7.18.9", "@babel/core@^7.23.0", "@babel/core@^7.24.4", "@babel/core@^7.26.10", "@babel/core@^7.7.7": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.3.tgz#aceddde69c5d1def69b839d09efa3e3ff59c97cb" + integrity sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.0" + "@babel/generator" "^7.28.3" "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.27.3" - "@babel/helpers" "^7.27.6" - "@babel/parser" "^7.28.0" + "@babel/helper-module-transforms" "^7.28.3" + "@babel/helpers" "^7.28.3" + "@babel/parser" "^7.28.3" "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.0" - "@babel/types" "^7.28.0" + "@babel/traverse" "^7.28.3" + "@babel/types" "^7.28.2" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -363,17 +341,6 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.12.5", "@babel/generator@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.3.tgz#9626c1741c650cbac39121694a0f2d7451b8ef3e" - integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== - dependencies: - "@babel/parser" "^7.28.3" - "@babel/types" "^7.28.2" - "@jridgewell/gen-mapping" "^0.3.12" - "@jridgewell/trace-mapping" "^0.3.28" - jsesc "^3.0.2" - "@babel/generator@^7.20.14": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" @@ -459,6 +426,17 @@ "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" +"@babel/generator@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.3.tgz#9626c1741c650cbac39121694a0f2d7451b8ef3e" + integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== + dependencies: + "@babel/parser" "^7.28.3" + "@babel/types" "^7.28.2" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.14.5": version "7.14.5" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz" @@ -737,15 +715,6 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helper-module-transforms@^7.12.1": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" - integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.28.3" - "@babel/helper-module-transforms@^7.14.5": version "7.15.8" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz" @@ -789,6 +758,15 @@ "@babel/helper-validator-identifier" "^7.27.1" "@babel/traverse" "^7.27.3" +"@babel/helper-module-transforms@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" + integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.28.3" + "@babel/helper-optimise-call-expression@^7.14.5", "@babel/helper-optimise-call-expression@^7.15.4": version "7.15.4" resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz" @@ -1047,14 +1025,6 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.12.5": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.3.tgz#b83156c0a2232c133d1b535dd5d3452119c7e441" - integrity sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw== - dependencies: - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.2" - "@babel/helpers@^7.27.6": version "7.28.2" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.2.tgz#80f0918fecbfebea9af856c419763230040ee850" @@ -1063,6 +1033,14 @@ "@babel/template" "^7.27.2" "@babel/types" "^7.28.2" +"@babel/helpers@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.3.tgz#b83156c0a2232c133d1b535dd5d3452119c7e441" + integrity sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.2" + "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz" @@ -1100,19 +1078,7 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@7.12.16": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4" - integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw== - -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.15.4", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0", "@babel/parser@^7.24.4", "@babel/parser@^7.24.5", "@babel/parser@^7.25.9", "@babel/parser@^7.26.2", "@babel/parser@^7.27.0", "@babel/parser@^7.27.1", "@babel/parser@^7.27.2", "@babel/parser@^7.27.3", "@babel/parser@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" - integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== - dependencies: - "@babel/types" "^7.28.0" - -"@babel/parser@^7.12.7", "@babel/parser@^7.28.3": +"@babel/parser@7.12.16", "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.6", "@babel/parser@^7.15.4", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0", "@babel/parser@^7.24.4", "@babel/parser@^7.24.5", "@babel/parser@^7.25.9", "@babel/parser@^7.26.2", "@babel/parser@^7.27.0", "@babel/parser@^7.27.1", "@babel/parser@^7.27.2", "@babel/parser@^7.27.3", "@babel/parser@^7.28.0", "@babel/parser@^7.28.3": version "7.28.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.3.tgz#d2d25b814621bca5fe9d172bc93792547e7a2a71" integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA== @@ -2310,15 +2276,6 @@ resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.26.10.tgz#1fce13e5a331a9dafff192b5db41350d72d44bed" integrity sha512-AYXK0hLWfEaK9WAePJqs30qro09a8w7X3YZzjukqtLXreE7xBZYdi5EMrP87T4UrVqmQ9tIX6L6SeTu5LDh3zw== -"@babel/template@^7.12.7", "@babel/template@^7.27.1", "@babel/template@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" - integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" - "@babel/types" "^7.27.1" - "@babel/template@^7.15.4": version "7.15.4" resolved "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz" @@ -2364,6 +2321,15 @@ "@babel/parser" "^7.27.0" "@babel/types" "^7.27.0" +"@babel/template@^7.27.1", "@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + "@babel/traverse@7.12.13": version "7.12.13" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz" @@ -2394,19 +2360,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.12.9", "@babel/traverse@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.3.tgz#6911a10795d2cce43ec6a28cffc440cca2593434" - integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.3" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.3" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.2" - debug "^4.3.1" - "@babel/traverse@^7.18.9": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" @@ -2504,6 +2457,19 @@ "@babel/types" "^7.28.0" debug "^4.3.1" +"@babel/traverse@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.3.tgz#6911a10795d2cce43ec6a28cffc440cca2593434" + integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.3" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.3" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.2" + debug "^4.3.1" + "@babel/types@7.12.13": version "7.12.13" resolved "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz" @@ -2521,14 +2487,6 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" -"@babel/types@^7.12.7", "@babel/types@^7.28.2": - version "7.28.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" - integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/types@^7.16.7": version "7.17.0" resolved "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz" @@ -2631,6 +2589,14 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" +"@babel/types@^7.28.2": + version "7.28.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" + integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@bergos/jsonparse@^1.4.0": version "1.4.1" resolved "https://registry.yarnpkg.com/@bergos/jsonparse/-/jsonparse-1.4.1.tgz#560e7125f65d0ad6b96dfe1c0d5da3115b9f8c59" @@ -15806,7 +15772,7 @@ gcp-metadata@^6.1.0: google-logging-utils "^0.0.2" json-bigint "^1.0.0" -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -22954,7 +22920,7 @@ resolve@^1.12.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.13.1, resolve@^1.22.4, resolve@^1.22.8, resolve@^1.3.2: +resolve@^1.13.1, resolve@^1.22.4, resolve@^1.22.8: version "1.22.10" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== @@ -23325,11 +23291,6 @@ semver-compare@^1.0.0: resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^5.4.1: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"