diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/package-lock.json b/force-app/main/react-recipes/uiBundles/reactRecipes/package-lock.json index 6426149..76d9853 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/package-lock.json +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/package-lock.json @@ -10,8 +10,8 @@ "dependencies": { "@salesforce-ux/design-system": "2.29.0", "@salesforce/design-system-react": "^0.10.65", - "@salesforce/sdk-data": "^1.134.4", - "@salesforce/ui-bundle": "^1.134.4", + "@salesforce/platform-sdk": "^10.24.0", + "@salesforce/ui-bundle": "^10.24.0", "@tailwindcss/vite": "^4.1.17", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -21,7 +21,7 @@ "react": "^19.2.0", "react-day-picker": "^9.14.0", "react-dom": "^19.2.0", - "react-router": "^7.15.1", + "react-router": "^7.10.1", "shadcn": "^3.8.5", "sonner": "^2.0.7", "tailwind-merge": "^3.5.0", @@ -36,7 +36,7 @@ "@graphql-eslint/eslint-plugin": "^4.1.0", "@graphql-tools/utils": "^11.0.0", "@playwright/test": "^1.49.0", - "@salesforce/vite-plugin-ui-bundle": "^1.134.4", + "@salesforce/vite-plugin-ui-bundle": "^10.24.0", "@shikijs/twoslash": "^4.0.2", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.6.3", @@ -61,7 +61,7 @@ "shiki": "^4.0.2", "typescript": "~5.9.3", "typescript-eslint": "^8.46.4", - "vite": "^7.3.5", + "vite": "^7.2.4", "vite-plugin-graphql-codegen": "^3.6.3", "vitest": "^4.0.17", "vitest-axe": "^1.0.0-pre.5" @@ -604,39 +604,283 @@ "node": ">=18" } }, + "node_modules/@conduit-client/command-base": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/command-base/-/command-base-3.19.6.tgz", + "integrity": "sha512-zbjMSv4d0SEPR63/HTa4lFoJtMHUMQ810GprFFR9U3OcZZ4PCyUQeyM8DIja/IsRgH7HDDEL7DnhF5mpT5UxDA==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/utils": "3.19.6" + } + }, + "node_modules/@conduit-client/command-cache-control": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/command-cache-control/-/command-cache-control-3.19.6.tgz", + "integrity": "sha512-ReZdJa5S65sGqXWocq6PkUEodon9xaBHzdpPHrdhFADotjhJY2wYQ9/050tnQ7TVg31IkeUZNNrj4WPEdYwV7w==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/command-base": "3.19.6", + "@conduit-client/service-cache-control": "3.19.6", + "@conduit-client/service-instrumentation": "3.19.6", + "@conduit-client/utils": "3.19.6" + } + }, + "node_modules/@conduit-client/command-http-cache-control": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/command-http-cache-control/-/command-http-cache-control-3.19.6.tgz", + "integrity": "sha512-41bjECK4JByGKpj6chojO25i1sgOnvQoklvzgW6L9BuLE5d3uzBw6JmY5srAOiaP1t0ZYHeHm+lLnuZ7R3BjRA==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/command-base": "3.19.6", + "@conduit-client/command-cache-control": "3.19.6", + "@conduit-client/service-aura-network": "3.19.6", + "@conduit-client/service-cache-control": "3.19.6", + "@conduit-client/service-fetch-network": "3.19.6", + "@conduit-client/service-pubsub": "3.19.6", + "@conduit-client/utils": "3.19.6" + } + }, + "node_modules/@conduit-client/jsonschema-validate": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/jsonschema-validate/-/jsonschema-validate-3.19.6.tgz", + "integrity": "sha512-XVEzbVc568gW3gu5YZh9CAVMZNjQ5hdTkR9M8ApsXX7GYhxy41Vl9F6Kkig9SFr6K0xDxAmfldvHSxkqHFebXw==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/utils": "3.19.6" + } + }, "node_modules/@conduit-client/jwt-manager": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@conduit-client/jwt-manager/-/jwt-manager-3.17.0.tgz", - "integrity": "sha512-u+NgdadxOqfKy7ak7z0zCrcAL4A66mOIuekob6pjogswi8cgebvtvFRO4Mag53n6pSCmRZ4DNlXIe5eylpXo3g==", + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/jwt-manager/-/jwt-manager-3.19.6.tgz", + "integrity": "sha512-tpkg0DtJxTdW/zac+nm8wCpSw2wavYtOfVDHfmAAtH/FF39PWjcam7ldyru1G95NR2JbvAxbLQZefC+Dt0n5kg==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "jwt-decode": "~3.1.2" } }, + "node_modules/@conduit-client/onestore-graphql-parser": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/onestore-graphql-parser/-/onestore-graphql-parser-3.19.6.tgz", + "integrity": "sha512-zz02oNZjrxWQDAt7jN3yKurCdQTp2Jz3Cp9fhkZhJ/NNUqElcQUPK/3ruUX5MhwpjbbVU4KXvNNqwjg0We7UoA==", + "license": "MIT", + "dependencies": { + "@conduit-client/jsonschema-validate": "3.19.6", + "@conduit-client/utils": "3.19.6", + "graphql": "16.11.0" + } + }, + "node_modules/@conduit-client/onestore-graphql-parser/node_modules/graphql": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", + "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/@conduit-client/service-aura-network": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/service-aura-network/-/service-aura-network-3.19.6.tgz", + "integrity": "sha512-H8+Uq0A8e9QYtYrvVfkoha7ozQP8aCTqn9vYKt1WzehkzRI+webIZjNeCrJtFsXEW+s2Shwy2P3C3GY6tF/rUg==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/service-instrumentation": "3.19.6", + "@conduit-client/utils": "3.19.6" + } + }, + "node_modules/@conduit-client/service-cache": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/service-cache/-/service-cache-3.19.6.tgz", + "integrity": "sha512-WBQJgOXLZsAyWBnaOnliwgs+tx9JJsCGtLV31oqXrLbjxONk1NYNFbbpW70a8wLBJ0ZKFd4s/+nNicKwiGvRWw==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/service-instrumentation": "3.19.6", + "@conduit-client/utils": "3.19.6" + } + }, + "node_modules/@conduit-client/service-cache-control": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/service-cache-control/-/service-cache-control-3.19.6.tgz", + "integrity": "sha512-pQ2ipf9FZs2vPjG3d837kpGWQGK0fmj73spn6VUWy0jiewlZZ6L/uzZzV9smMv65yAHVWnBO6ZMi/jVp+y0YsQ==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/service-cache": "3.19.6", + "@conduit-client/service-cache-inclusion-policy": "3.19.6", + "@conduit-client/utils": "3.19.6" + } + }, + "node_modules/@conduit-client/service-cache-inclusion-policy": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/service-cache-inclusion-policy/-/service-cache-inclusion-policy-3.19.6.tgz", + "integrity": "sha512-q7kJguFTNdb5/RKykBXgDttWBwT7+tcS4zWwEaHXmDTlb4iTOlb5JfpSgFoEkx4mY1+QsiM179g4sP38IN+0jQ==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/service-cache": "3.19.6", + "@conduit-client/utils": "3.19.6" + } + }, "node_modules/@conduit-client/service-fetch-network": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@conduit-client/service-fetch-network/-/service-fetch-network-3.17.0.tgz", - "integrity": "sha512-K+KuFWU2N4kF+k/fsS4PSOM0eGdsTGfEtAuoG+/cuRPaQz2KkW33Gyk/KZGQyF+7ikBh0kGATXX1DDF+8XFopQ==", + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/service-fetch-network/-/service-fetch-network-3.19.6.tgz", + "integrity": "sha512-yOsiRyOrM03tmX92oVbThJs7jZfjiVBQZiGkV+I+980TrJGnAwvaZlQVeG4Ncb285HtpBzkUnuc05Eol/tlCgw==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/jwt-manager": "3.19.6", + "@conduit-client/service-retry": "3.19.6", + "@conduit-client/utils": "3.19.6" + } + }, + "node_modules/@conduit-client/service-instrumentation": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/service-instrumentation/-/service-instrumentation-3.19.6.tgz", + "integrity": "sha512-o+tR7hbwc2SNMYvKMW4IT0Z2JkO2BpCXiWchz/5N7GiKW1Xuhl/8jLY7mzmm96OVZGktPp4p4FHGlUiTdlqiSQ==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/service-instrumentation-noop": "3.19.6", + "@conduit-client/service-instrumentation-o11y": "3.19.6", + "@conduit-client/service-instrumentation-types": "3.19.6", + "@conduit-client/utils": "3.19.6", + "@opentelemetry/api": "1.7.0" + } + }, + "node_modules/@conduit-client/service-instrumentation-noop": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/service-instrumentation-noop/-/service-instrumentation-noop-3.19.6.tgz", + "integrity": "sha512-4OuCYyNJnfDqIWXlTTxfhEkMbanIruZrMr8Rzx+MBPuYSqMSJmzCRD1Imf9nh84RedmdC4OlOxdgF6FVgYRcfQ==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/service-instrumentation-types": "3.19.6", + "@conduit-client/utils": "3.19.6", + "@opentelemetry/api": "1.7.0" + } + }, + "node_modules/@conduit-client/service-instrumentation-noop/node_modules/@opentelemetry/api": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@conduit-client/service-instrumentation-o11y": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/service-instrumentation-o11y/-/service-instrumentation-o11y-3.19.6.tgz", + "integrity": "sha512-NQU9jeob5ARas8HpcyMADvhEyQk76YaBvWV6qGdQi22vPK636FCZDucysL++Q2iCSrszX5SS++0q4HEQo1mFog==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/service-instrumentation-types": "3.19.6", + "@conduit-client/utils": "3.19.6", + "@opentelemetry/api": "1.7.0", + "o11y": "252.7.0" + } + }, + "node_modules/@conduit-client/service-instrumentation-o11y/node_modules/@opentelemetry/api": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@conduit-client/service-instrumentation-o11y/node_modules/o11y": { + "version": "252.7.0", + "resolved": "https://registry.npmjs.org/o11y/-/o11y-252.7.0.tgz", + "integrity": "sha512-/P79vBumoxplQ4aqjW8GoVEMk7Uj50HOmZQAyNtu/FE8FuPXSh9rnkguxUDfN5l1oWI8Eyktrnu3XRs56OkQVQ==", + "license": "BSD-3-Clause", + "dependencies": { + "o11y_schema": "252.11.0", + "protobufjs": "7.2.4", + "web-vitals": "3.5.2" + } + }, + "node_modules/@conduit-client/service-instrumentation-o11y/node_modules/o11y_schema": { + "version": "252.11.0", + "resolved": "https://registry.npmjs.org/o11y_schema/-/o11y_schema-252.11.0.tgz", + "integrity": "sha512-gdzht1/LRbnJZZGtR2M6ACopNLiwuUs0yP8OGnDbpCTJITwDS9S5wb7qbxUMY2kyhXkGR3oD8RY0C1S6+/1rRQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@conduit-client/service-instrumentation-o11y/node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@conduit-client/service-instrumentation-o11y/node_modules/web-vitals": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz", + "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==", + "license": "Apache-2.0" + }, + "node_modules/@conduit-client/service-instrumentation-types": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/service-instrumentation-types/-/service-instrumentation-types-3.19.6.tgz", + "integrity": "sha512-BZ6BsYa2StM2+bGWnv/cB4SXaS9fCTQX1bL9z0UqIZbPmBYhtr640/SirAl8z2pqnl0Qd5OZnYAlpyLSqJoKOg==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@conduit-client/utils": "3.19.6", + "@opentelemetry/api": "1.7.0" + } + }, + "node_modules/@conduit-client/service-instrumentation-types/node_modules/@opentelemetry/api": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@conduit-client/service-instrumentation/node_modules/@opentelemetry/api": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@conduit-client/service-pubsub": { + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/service-pubsub/-/service-pubsub-3.19.6.tgz", + "integrity": "sha512-HgWWiXMX43jorZNtqEHx/8cxRImcga6ycjCS6NRPnYStsndIBZIR53GnKcXbPvvaO/v5BhA3WWiWwSYe38OF2A==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@conduit-client/jwt-manager": "3.17.0", - "@conduit-client/service-retry": "3.17.0", - "@conduit-client/utils": "3.17.0" + "@conduit-client/utils": "3.19.6" } }, "node_modules/@conduit-client/service-retry": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@conduit-client/service-retry/-/service-retry-3.17.0.tgz", - "integrity": "sha512-IrjXZUltgx7P47/cniQfvQF6H2jMlsOCOUcNGm4B1fRQpi8dyv2/Rh7VQUbIRSfYsIIJA1x/yf/BdY8Mo4Q8Jw==", + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/service-retry/-/service-retry-3.19.6.tgz", + "integrity": "sha512-Zb1V2un+X3iFFN/eiY+V+G9cfvRqK2ppHjKWVF+SXRY52fOKVbEvbRA/n/YM/xemfA4PiMcmNzOrhvHwYNImaw==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@conduit-client/utils": "3.17.0" + "@conduit-client/utils": "3.19.6" } }, "node_modules/@conduit-client/utils": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@conduit-client/utils/-/utils-3.17.0.tgz", - "integrity": "sha512-jeq1b3I/Bxe9XHQ2CjBZcc+mkY1TxUtjuowmF8iw9A6PZYG5Sl2TMxyCtbZySHxbHMdWWc3JDJuVwc/m7do0eg==", + "version": "3.19.6", + "resolved": "https://registry.npmjs.org/@conduit-client/utils/-/utils-3.19.6.tgz", + "integrity": "sha512-sEE8RIz1+LxPJJVkBsSATgQBEn91pKdiEahUqisnodmnct+uLbI+bi/k4NPXoNMSIZM7W2VgEWFQDHF2GXZ28w==", "license": "SEE LICENSE IN LICENSE.txt" }, "node_modules/@csstools/color-helpers": { @@ -3216,6 +3460,18 @@ "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "license": "MIT" }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@pinojs/redact": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", @@ -3245,6 +3501,69 @@ "dev": true, "license": "MIT" }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", + "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "license": "BSD-3-Clause" + }, "node_modules/@radix-ui/number": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", @@ -3762,6 +4081,16 @@ } } }, + "node_modules/@radix-ui/react-icons": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz", + "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" + } + }, "node_modules/@radix-ui/react-id": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", @@ -5221,6 +5550,12 @@ "react-dom": "^15.4.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@salesforce/jsonrpc": { + "version": "10.24.0", + "resolved": "https://registry.npmjs.org/@salesforce/jsonrpc/-/jsonrpc-10.24.0.tgz", + "integrity": "sha512-kqN/2XOMnjxiBa59cAm6S6RTHNw6H0YRC/5wCp/2xOhFeZiT25HpPB7dKLMF4OsnItSmO8lvvkl0UUvEPkDCUw==", + "license": "SEE LICENSE IN LICENSE.txt" + }, "node_modules/@salesforce/kit": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/@salesforce/kit/-/kit-3.2.6.tgz", @@ -5230,21 +5565,27 @@ "@salesforce/ts-types": "^2.0.12" } }, - "node_modules/@salesforce/sdk-core": { - "version": "1.134.4", - "resolved": "https://registry.npmjs.org/@salesforce/sdk-core/-/sdk-core-1.134.4.tgz", - "integrity": "sha512-ZqcK4ey6TKwNTxnLM1rNifNW8achYKTqzNhwE6d+hStufhgF/lnlvoYxxrBsnS1+EVD3EdOEBWrNNcbA1PyluA==", - "license": "SEE LICENSE IN LICENSE.txt" - }, - "node_modules/@salesforce/sdk-data": { - "version": "1.134.4", - "resolved": "https://registry.npmjs.org/@salesforce/sdk-data/-/sdk-data-1.134.4.tgz", - "integrity": "sha512-7ifc4laGHmTQkw48YRBicd8lgIPrMBhN9FiylWLFoJ8IOMQWvckZfXhYCHV+f8QgLTjIdQP5sq9XdJHwPnBX9A==", + "node_modules/@salesforce/platform-sdk": { + "version": "10.24.0", + "resolved": "https://registry.npmjs.org/@salesforce/platform-sdk/-/platform-sdk-10.24.0.tgz", + "integrity": "sha512-5Jyt1TgNvJGU/p0XAPWU8KhlOpzldPYD0XW+ynWd68fve0OOJVEtpb93+g/9AoE8w4vSx2Eru0UwNdg8r0ZyWw==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@conduit-client/service-fetch-network": "3.17.0", - "@conduit-client/utils": "3.17.0", - "@salesforce/sdk-core": "^1.134.4" + "@conduit-client/command-http-cache-control": "3.19.6", + "@conduit-client/onestore-graphql-parser": "3.19.6", + "@conduit-client/service-cache": "3.19.6", + "@conduit-client/service-cache-control": "3.19.6", + "@conduit-client/service-cache-inclusion-policy": "3.19.6", + "@conduit-client/service-fetch-network": "3.19.6", + "@conduit-client/service-pubsub": "3.19.6", + "@conduit-client/service-retry": "3.19.6", + "@conduit-client/utils": "3.19.6", + "@salesforce/jsonrpc": "^10.24.0", + "@sf-embedding/sf-embedding-bridge": "2.2.1-rc.4" + }, + "peerDependencies": { + "o11y": ">=260.0.0", + "o11y_schema": ">=264.85.0" } }, "node_modules/@salesforce/ts-types": { @@ -5257,13 +5598,13 @@ } }, "node_modules/@salesforce/ui-bundle": { - "version": "1.134.4", - "resolved": "https://registry.npmjs.org/@salesforce/ui-bundle/-/ui-bundle-1.134.4.tgz", - "integrity": "sha512-+oMQukfnXn9FJErQGjlMqahRbTSCm39es/xXcf86zdUhXJ7mJvS8eg6K0aqc9TQ+mTa16vsO0k7Y9WpjrhF0sA==", + "version": "10.24.0", + "resolved": "https://registry.npmjs.org/@salesforce/ui-bundle/-/ui-bundle-10.24.0.tgz", + "integrity": "sha512-Q3yWid7nv2VFoxlfOTDaAqF9vEfAcqfEJpOA3YxL4Ccm3CSG7Gp7eUhCtT99qXM/QcqnSkERdrPeZ41XdQRL1g==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@salesforce/core": "^8.23.4", - "@salesforce/sdk-data": "^1.134.4", + "@salesforce/platform-sdk": "^10.24.0", "micromatch": "^4.0.8", "path-to-regexp": "^8.3.0" }, @@ -5271,16 +5612,50 @@ "node": ">=20.0.0" } }, + "node_modules/@salesforce/ui-design-mode": { + "version": "10.24.0", + "resolved": "https://registry.npmjs.org/@salesforce/ui-design-mode/-/ui-design-mode-10.24.0.tgz", + "integrity": "sha512-8XILHoc0+cLQhEbFrxS2L4Fg9VtmF1QYtGSG7/tUHxyfcP96aTkue7nzJiLVE+2V6XWHO/GPIOVh7GHDPNJZUQ==", + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.3", + "@radix-ui/react-icons": "1.3.2", + "@radix-ui/react-toggle-group": "1.1.11", + "culori": "^4.0.1", + "downshift": "9.3.2", + "lucide-react": "0.575.0", + "react-beautiful-color": "2.1.0", + "use-debounce": "^10.0.4" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@salesforce/ui-design-mode/node_modules/lucide-react": { + "version": "0.575.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.575.0.tgz", + "integrity": "sha512-VuXgKZrk0uiDlWjGGXmKV6MSk9Yy4l10qgVvzGn2AWBx1Ylt0iBexKOAoA6I7JO3m+M9oeovJd3yYENfkUbOeg==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@salesforce/vite-plugin-ui-bundle": { - "version": "1.134.4", - "resolved": "https://registry.npmjs.org/@salesforce/vite-plugin-ui-bundle/-/vite-plugin-ui-bundle-1.134.4.tgz", - "integrity": "sha512-IDvsrveejQx2Wr7f+265P60KgQ2QVMEFvzrvDKjyOnghqYUN6bjHygrerZRcYbr+FzF6RNhoe6hLLHGsFJAnAg==", + "version": "10.24.0", + "resolved": "https://registry.npmjs.org/@salesforce/vite-plugin-ui-bundle/-/vite-plugin-ui-bundle-10.24.0.tgz", + "integrity": "sha512-RbgVFDvWkPOjOtnAGkihMsHtJsGkmud+NNUWAtnRY10oEzQ21vMofBmplWFUtgF49Trsf1GHbn/zVCnC4PdqWA==", "dev": true, "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@babel/core": "^7.28.4", - "@babel/helper-plugin-utils": "^7.28.3", - "@salesforce/ui-bundle": "^1.134.4" + "@salesforce/ui-bundle": "^10.24.0", + "@salesforce/ui-design-mode": "^10.24.0" }, "engines": { "node": ">=20.0.0" @@ -5295,6 +5670,21 @@ "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", "license": "MIT" }, + "node_modules/@sf-embedding/sf-embedding-bridge": { + "version": "2.2.1-rc.4", + "resolved": "https://registry.npmjs.org/@sf-embedding/sf-embedding-bridge/-/sf-embedding-bridge-2.2.1-rc.4.tgz", + "integrity": "sha512-7V4kXfQ7fk40ZASIZAaaBObjwEaJO0OPR5LoczuJhUE4bg838QU58U+OBPrRJWUnfZgIKSawDTGEX5Atk+4szQ==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@salesforce/jsonrpc": "^9.13.0" + } + }, + "node_modules/@sf-embedding/sf-embedding-bridge/node_modules/@salesforce/jsonrpc": { + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/@salesforce/jsonrpc/-/jsonrpc-9.21.0.tgz", + "integrity": "sha512-EpUBVDpBc6bKXIVmhvdpw54r3U9oi+KLbatax9/kJyes04yxSRvchwPCHoCQkYnoE3vojCbZ2OTubg8RzAL0xQ==", + "license": "SEE LICENSE IN LICENSE.txt" + }, "node_modules/@shikijs/core": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", @@ -6019,7 +6409,6 @@ "version": "24.12.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", - "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -8006,6 +8395,13 @@ "dev": true, "license": "MIT" }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8228,6 +8624,16 @@ "integrity": "sha512-UdtziYp5HuTz7e5j8Nvq+a/3HQo+2/aJZ9xntNTpmRRIg/3YYqDVgiS9fvAhtNbnyfbv2ZBe0bqCHqzhE7FqWQ==", "license": "MIT" }, + "node_modules/culori": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/culori/-/culori-4.0.2.tgz", + "integrity": "sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -8631,6 +9037,30 @@ "url": "https://dotenvx.com" } }, + "node_modules/downshift": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.3.2.tgz", + "integrity": "sha512-5VD0WZLQDhipWiDU+K5ili3VDhGrXwlvOlSaSG1Cb0eS4XpssxVuoD09JNgju+bAzxB2Wvlwx+FwTE/FNdrqow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "compute-scroll-into-view": "^3.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "tslib": "^2.8.1" + }, + "peerDependencies": { + "react": ">=16.12.0" + } + }, + "node_modules/downshift/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -12623,6 +13053,12 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -13313,6 +13749,32 @@ "dev": true, "license": "MIT" }, + "node_modules/o11y": { + "version": "264.20.0", + "resolved": "https://registry.npmjs.org/o11y/-/o11y-264.20.0.tgz", + "integrity": "sha512-QmwrEv2CYNzEIOnArYP1522vbNuB+KTAWu4K+8174bZ5ua2aSFMQW0Q7MLLcl6QrekMBTRt/HmL4sNL5pnr5xg==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "o11y_schema": "260.5.0", + "protobufjs": "7.5.6", + "web-vitals": "^5.1.0" + } + }, + "node_modules/o11y_schema": { + "version": "264.90.0", + "resolved": "https://registry.npmjs.org/o11y_schema/-/o11y_schema-264.90.0.tgz", + "integrity": "sha512-b4Z87+C+RIeqqeXW/Gee3cPeBu0xXDygYZXZRfJivJU2qvTpt4btJDUXLqxxC8A7KPQlYIrs5yDxocCqEX5+WQ==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/o11y/node_modules/o11y_schema": { + "version": "260.5.0", + "resolved": "https://registry.npmjs.org/o11y_schema/-/o11y_schema-260.5.0.tgz", + "integrity": "sha512-0qrtqE394CODoPovUBdQQ2efHls6Z2xP6jvLitEGKSEj1KcCyeBLx2dHwTUtv66zwZTKjSp27QLFF4PZhengEQ==", + "license": "BSD-3-Clause", + "peer": true + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -14214,6 +14676,110 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.5.tgz", + "integrity": "sha512-zxcTTCedNGJM4R8sj/Cq/F0W/c4iE0afWBcBwMTRtw4WHYP9TWkYjdiH3npPRUYsXQCPR0hTU9yjovOu+E6EQA==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.14.tgz", + "integrity": "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -14355,6 +14921,31 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/protobufjs": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz", + "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.1", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -14566,6 +15157,22 @@ "node": ">=0.10.0" } }, + "node_modules/react-beautiful-color": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-beautiful-color/-/react-beautiful-color-2.1.0.tgz", + "integrity": "sha512-6pjk4U9VQkxQ2StqoptSmUBqbXKOwSWuU/A0dOHn3j6U7hMs4ethdpNdU/whsFbdXffU1b0eYg5SZ9WD7osl7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "prettier-plugin-tailwindcss": "^0.6.8", + "tailwind-merge": "^3.3.1" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, "node_modules/react-contenteditable": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/react-contenteditable/-/react-contenteditable-3.3.7.tgz", @@ -14712,9 +15319,9 @@ "license": "MIT" }, "node_modules/react-router": { - "version": "7.15.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.15.1.tgz", - "integrity": "sha512-R8rl9HhgikFYoPJymnUtPXWbnDb3oget6lQnfIoupbt61aT9aOhRkDsY2XRhZRyX1Z/8a5sL74fXmFNm3NRK5A==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.0.tgz", + "integrity": "sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -16981,7 +17588,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "devOptional": true, "license": "MIT" }, "node_modules/unicorn-magic": { @@ -17206,6 +17812,19 @@ } } }, + "node_modules/use-debounce": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.1.1.tgz", + "integrity": "sha512-kvds8BHR2k28cFsxW8k3nc/tRga2rs1RHYCqmmGqb90MEeE++oALwzh2COiuBLO1/QXiOuShXoSN2ZpWnMmvuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "react": "*" + } + }, "node_modules/use-sidecar": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", @@ -17292,9 +17911,9 @@ } }, "node_modules/vite": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.5.tgz", - "integrity": "sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "license": "MIT", "dependencies": { "esbuild": "^0.27.0", @@ -18063,6 +18682,13 @@ "node": ">= 8" } }, + "node_modules/web-vitals": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.3.0.tgz", + "integrity": "sha512-q6LWsLatGYZp5VGBIOvbTj6JBV2nOmC8KvWztXBmwJcfFAzhwKwbOxhUH306XY3CcaZDUlSmSuNPBsCn0bFu+g==", + "license": "Apache-2.0", + "peer": true + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/package.json b/force-app/main/react-recipes/uiBundles/reactRecipes/package.json index 3f89cff..22d8fe3 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/package.json +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/package.json @@ -19,8 +19,8 @@ "dependencies": { "@salesforce-ux/design-system": "2.29.0", "@salesforce/design-system-react": "^0.10.65", - "@salesforce/sdk-data": "^1.134.4", - "@salesforce/ui-bundle": "^1.134.4", + "@salesforce/platform-sdk": "^10.24.0", + "@salesforce/ui-bundle": "^10.24.0", "@tailwindcss/vite": "^4.1.17", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -30,7 +30,7 @@ "react": "^19.2.0", "react-day-picker": "^9.14.0", "react-dom": "^19.2.0", - "react-router": "^7.15.1", + "react-router": "^7.10.1", "shadcn": "^3.8.5", "sonner": "^2.0.7", "tailwind-merge": "^3.5.0", @@ -50,7 +50,7 @@ "@graphql-eslint/eslint-plugin": "^4.1.0", "@graphql-tools/utils": "^11.0.0", "@playwright/test": "^1.49.0", - "@salesforce/vite-plugin-ui-bundle": "^1.134.4", + "@salesforce/vite-plugin-ui-bundle": "^10.24.0", "@shikijs/twoslash": "^4.0.2", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.6.3", @@ -75,7 +75,7 @@ "shiki": "^4.0.2", "typescript": "~5.9.3", "typescript-eslint": "^8.46.4", - "vite": "^7.3.5", + "vite": "^7.2.4", "vite-plugin-graphql-codegen": "^3.6.3", "vitest": "^4.0.17", "vitest-axe": "^1.0.0-pre.5" diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/account.ts b/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/account.ts index a9b5916..56eeea3 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/account.ts +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/account.ts @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import type { GetFirstAccountQuery, GetAccountsQuery, @@ -65,13 +65,13 @@ export function useFirstAccount(): { export async function getFirstAccount(): Promise { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: GET_FIRST_ACCOUNT }); + const result = await sdk.graphql?.query({ query: GET_FIRST_ACCOUNT }); if (result?.errors?.length) { throw new Error(result.errors.map(e => e.message).join('; ')); } - return result?.data.uiapi?.query?.Account?.edges?.[0]?.node ?? undefined; + return result?.data?.uiapi?.query?.Account?.edges?.[0]?.node ?? undefined; } const GET_ACCOUNTS = gql` @@ -106,13 +106,13 @@ export type Account = NonNullable; export async function getAccounts(): Promise { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: GET_ACCOUNTS }); + const result = await sdk.graphql?.query({ query: GET_ACCOUNTS }); if (result?.errors?.length) { throw new Error(result.errors.map(e => e.message).join('; ')); } - return (result?.data.uiapi?.query?.Account?.edges ?? []) + return (result?.data?.uiapi?.query?.Account?.edges ?? []) .map(edge => edge?.node) .filter((node): node is Account => node != null); } diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/accounts.ts b/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/accounts.ts index 7e4434a..62a2bd7 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/accounts.ts +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/accounts.ts @@ -1,4 +1,4 @@ -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { GetAccountsWithContactsQuery } from './graphql-operations-types'; const GET_ACCOUNTS_WITH_CONTACTS = gql` @@ -56,7 +56,7 @@ export async function getAccountsWithContacts(): Promise< AccountWithContacts[] > { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ + const result = await sdk.graphql?.query({ query: GET_ACCOUNTS_WITH_CONTACTS, }); @@ -64,7 +64,7 @@ export async function getAccountsWithContacts(): Promise< throw new Error(result.errors.map(e => e.message).join('; ')); } - return (result?.data.uiapi?.query?.Account?.edges ?? []) + return (result?.data?.uiapi?.query?.Account?.edges ?? []) .map(edge => edge?.node) .filter((node): node is AccountWithContacts => node != null); } diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/contacts.ts b/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/contacts.ts index 6f7ec44..062be62 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/contacts.ts +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/contacts.ts @@ -1,4 +1,4 @@ -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { GetContactsQuery } from './graphql-operations-types'; const GET_CONTACTS = gql` @@ -45,13 +45,13 @@ export type Contact = ContactNode; export async function getContacts(): Promise<(ContactNode | undefined)[]> { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: GET_CONTACTS }); + const result = await sdk.graphql?.query({ query: GET_CONTACTS }); if (result?.errors?.length) { throw new Error(result.errors.map(e => e.message).join('; ')); } - const connection = result?.data.uiapi?.query?.Contact; + const connection = result?.data?.uiapi?.query?.Contact; return (connection?.edges ?? []) .map(edge => edge?.node) diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/graphql-operations-types.ts b/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/graphql-operations-types.ts index 253ff8d..461415b 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/graphql-operations-types.ts +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/api/graphql-operations-types.ts @@ -21,6 +21,7 @@ export type Scalars = { EncryptedString: { input: string; output: string; } /** Can be set to an ID or a Reference to the result of another mutation operation. */ IdOrRef: { input: string; output: string; } + JSON: { input: string; output: string; } Latitude: { input: number | string; output: number; } /** A 64-bit signed integer */ Long: { input: number; output: number; } diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/GraphqlErrors.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/GraphqlErrors.test.tsx index 7f8971d..da7c9ee 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/GraphqlErrors.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/GraphqlErrors.test.tsx @@ -9,11 +9,11 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import GraphqlErrors from './GraphqlErrors'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -22,7 +22,7 @@ describe('GraphqlErrors', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/GraphqlErrors.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/GraphqlErrors.tsx index 90c390f..2bd3fb9 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/GraphqlErrors.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/GraphqlErrors.tsx @@ -12,7 +12,7 @@ * @see ErrorBoundaryRecipe — catching render-time JavaScript errors */ import { useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Button } from '@/components/ui/button'; // This query intentionally asks for a field that doesn't exist on Account. @@ -71,7 +71,7 @@ export default function GraphqlErrors() { try { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query }); + const result = await sdk.graphql?.query({ query }); // Layer 1: result.errors[] — query-level errors (bad fields, auth, etc.) if (result?.errors?.length) { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/LoadingErrorEmpty.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/LoadingErrorEmpty.test.tsx index 6ea2c0b..a2f551e 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/LoadingErrorEmpty.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/LoadingErrorEmpty.test.tsx @@ -13,8 +13,8 @@ import LoadingErrorEmpty from './LoadingErrorEmpty'; const mockGraphql = vi.fn(); -vi.mock('@salesforce/sdk-data', () => ({ - createDataSDK: vi.fn(() => Promise.resolve({ graphql: mockGraphql })), +vi.mock('@salesforce/platform-sdk', () => ({ + createDataSDK: vi.fn(() => Promise.resolve({ graphql: { query: mockGraphql, mutate: mockGraphql } })), gql: (strings: TemplateStringsArray) => strings.join(''), })); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/LoadingErrorEmpty.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/LoadingErrorEmpty.tsx index c63da77..51a9ab4 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/LoadingErrorEmpty.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/error-handling/LoadingErrorEmpty.tsx @@ -13,7 +13,7 @@ * @see GraphqlErrors — inspecting GraphQL error objects */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import Skeleton from '@/components/recipe/Skeleton'; import { Button } from '@/components/ui/button'; import { Avatar, AvatarImage } from '@/components/ui/avatar'; @@ -89,7 +89,7 @@ export default function LoadingErrorEmpty() { function fetchContacts() { const run = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/BindingAccountName.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/BindingAccountName.test.tsx index 6b1fe46..bdc5788 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/BindingAccountName.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/BindingAccountName.test.tsx @@ -6,11 +6,11 @@ */ import { render, screen } from '@testing-library/react'; import type { Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import BindingAccountName from './BindingAccountName'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -32,7 +32,7 @@ describe('BindingAccountName', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/BindingAccountName.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/BindingAccountName.tsx index 179adcb..3aeae68 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/BindingAccountName.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/BindingAccountName.tsx @@ -13,7 +13,7 @@ * @see ConditionalStatus — conditional rendering with picklist data */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; // Every scalar field in UIAPI GraphQL is wrapped in { value }. // This is different from standard GraphQL where fields are plain scalars. @@ -55,7 +55,7 @@ export default function BindingAccountName() { useEffect(() => { const fetchName = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ChildToParent.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ChildToParent.test.tsx index 481e6b7..b602486 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ChildToParent.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ChildToParent.test.tsx @@ -8,11 +8,11 @@ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import ChildToParent from './ChildToParent'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -36,7 +36,7 @@ describe('ChildToParent', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ChildToParent.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ChildToParent.tsx index a4d5606..69bf858 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ChildToParent.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ChildToParent.tsx @@ -12,7 +12,7 @@ * @see StateManagement — sharing state between sibling components */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; // Industry picklist values from the Account standard object const INDUSTRIES = [ @@ -74,7 +74,7 @@ export default function ChildToParent() { const fetchAccounts = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ + const result = await sdk.graphql?.query({ query: QUERY, variables: { industry }, }); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ConditionalStatus.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ConditionalStatus.test.tsx index 40aace8..ada9acf 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ConditionalStatus.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ConditionalStatus.test.tsx @@ -6,11 +6,11 @@ */ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import ConditionalStatus from './ConditionalStatus'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -40,7 +40,7 @@ describe('ConditionalStatus', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ConditionalStatus.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ConditionalStatus.tsx index c346efd..2b11877 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ConditionalStatus.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ConditionalStatus.tsx @@ -11,7 +11,7 @@ * @see ListOfAccounts — rendering a list of records with .map() */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Badge } from '@/components/ui/badge'; const QUERY = gql` @@ -64,7 +64,7 @@ export default function ConditionalStatus() { useEffect(() => { const fetchAccount = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/LifecycleFetch.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/LifecycleFetch.test.tsx index 961bf2e..55154fa 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/LifecycleFetch.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/LifecycleFetch.test.tsx @@ -8,11 +8,11 @@ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import LifecycleFetch from './LifecycleFetch'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -42,7 +42,7 @@ describe('LifecycleFetch', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/LifecycleFetch.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/LifecycleFetch.tsx index 3938426..d3a7917 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/LifecycleFetch.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/LifecycleFetch.tsx @@ -14,7 +14,7 @@ * @see SingleRecord — querying a single record with GraphQL */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Button } from '@/components/ui/button'; const QUERY = gql` @@ -84,7 +84,7 @@ function ContactFetcher() { const fetchContact = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (stale) return; // component was unmounted while fetching diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ListOfAccounts.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ListOfAccounts.test.tsx index 7d55dc0..591cb98 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ListOfAccounts.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ListOfAccounts.test.tsx @@ -1,5 +1,5 @@ /** - * The vi.mock() call below intercepts the @salesforce/sdk-data module for the + * The vi.mock() call below intercepts the @salesforce/platform-sdk module for the * entire test file. In LWC Jest the equivalent is registering a wire adapter * mock — here there is no wire adapter, so a plain module mock is enough. * The mock data objects mirror the real UIAPI GraphQL response shape so the @@ -7,11 +7,11 @@ */ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import ListOfAccounts from './ListOfAccounts'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -48,7 +48,7 @@ describe('ListOfAccounts', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ListOfAccounts.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ListOfAccounts.tsx index 746dfc3..c6467e8 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ListOfAccounts.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ListOfAccounts.tsx @@ -11,7 +11,7 @@ * @see ParentToChild — passing data from parent to child components via props */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; const QUERY = gql` query AccountList { @@ -64,7 +64,7 @@ export default function ListOfAccounts() { useEffect(() => { const fetchAccounts = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ParentToChild.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ParentToChild.test.tsx index 7c2ba38..63e25a2 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ParentToChild.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ParentToChild.test.tsx @@ -10,11 +10,11 @@ */ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import ParentToChild from './ParentToChild'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -51,7 +51,7 @@ describe('ParentToChild', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ParentToChild.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ParentToChild.tsx index a7b166f..7904930 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ParentToChild.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/ParentToChild.tsx @@ -11,7 +11,7 @@ * @see ChildToParent — communicating from child back to parent via callbacks */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; const QUERY = gql` query TwoAccounts { @@ -64,7 +64,7 @@ export default function ParentToChild() { useEffect(() => { const fetchAccounts = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/StateManagement.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/StateManagement.test.tsx index 7d002ee..64fc378 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/StateManagement.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/StateManagement.test.tsx @@ -8,11 +8,11 @@ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import StateManagement from './StateManagement'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -49,7 +49,7 @@ describe('StateManagement', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/StateManagement.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/StateManagement.tsx index 53d6948..c1d1721 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/StateManagement.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/hello/StateManagement.tsx @@ -13,7 +13,7 @@ * @see LifecycleFetch — cleanup patterns for async effects */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Button } from '@/components/ui/button'; const QUERY = gql` @@ -68,7 +68,7 @@ export default function StateManagement() { useEffect(() => { const fetchAccounts = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/DashboardAliasedQueries.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/DashboardAliasedQueries.test.tsx index 8c808a8..022e9d7 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/DashboardAliasedQueries.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/DashboardAliasedQueries.test.tsx @@ -1,10 +1,10 @@ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import DashboardAliasedQueries from './DashboardAliasedQueries'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -32,7 +32,7 @@ describe('DashboardAliasedQueries', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/DashboardAliasedQueries.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/DashboardAliasedQueries.tsx index 41a89f9..01a547b 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/DashboardAliasedQueries.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/DashboardAliasedQueries.tsx @@ -18,7 +18,7 @@ * a wrapper object with counts for each object type. */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; // Three aliases in one request — each becomes a key in the response const QUERY = gql` @@ -75,7 +75,7 @@ export default function DashboardAliasedQueries() { useEffect(() => { const fetchStats = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/SearchableAccountList.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/SearchableAccountList.test.tsx index a78f70c..df74c31 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/SearchableAccountList.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/SearchableAccountList.test.tsx @@ -1,10 +1,10 @@ import { render, screen, fireEvent, act } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import SearchableAccountList from './SearchableAccountList'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -75,7 +75,7 @@ describe('SearchableAccountList', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); vi.useFakeTimers(); }); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/SearchableAccountList.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/SearchableAccountList.tsx index 62ddf55..c339d68 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/SearchableAccountList.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/integration/SearchableAccountList.tsx @@ -19,7 +19,7 @@ * @see DashboardAliasedQueries — combining aliased queries for dashboards */ import { useEffect, useState, useRef, useCallback } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Input } from '@/components/ui/input'; // The $name variable drives the `like` filter. Passing "%%" matches all. @@ -85,7 +85,7 @@ export default function SearchableAccountList() { try { const sdk = await createDataSDK(); // Wrap the search term in wildcards for the `like` operator - const result = await sdk.graphql?.({ + const result = await sdk.graphql?.query({ query: QUERY, variables: { name: term ? `%${term}%` : '%%' }, }); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/CreateRecord.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/CreateRecord.test.tsx index e641638..d9ec9d5 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/CreateRecord.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/CreateRecord.test.tsx @@ -6,11 +6,11 @@ import { render, screen, fireEvent } from '@testing-library/react'; import { type Mock } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import CreateRecord from './CreateRecord'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -30,7 +30,7 @@ describe('CreateRecord', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { @@ -80,7 +80,7 @@ describe('CreateRecord', () => { // here you assert the graphql function was called with a variables object. await screen.findByRole('status'); expect(mockGraphql).toHaveBeenCalledWith({ - query: expect.any(String), + mutation: expect.any(String), variables: expect.objectContaining({ input: { Account: { Name: 'New Account' } }, }), diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/CreateRecord.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/CreateRecord.tsx index 8a0a5fa..7cedcbd 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/CreateRecord.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/CreateRecord.tsx @@ -11,7 +11,7 @@ * @see UpdateRecord — editing an existing record */ import { useState, type FormEvent } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; @@ -57,8 +57,8 @@ export default function CreateRecord() { try { const sdk = await createDataSDK(); - const res = await sdk.graphql?.({ - query: CREATE_ACCOUNT, + const res = await sdk.graphql?.mutate({ + mutation: CREATE_ACCOUNT, variables: { input: { Account: { Name: name.trim() } } }, }); @@ -66,7 +66,7 @@ export default function CreateRecord() { throw new Error(res.errors.map((e: { message: string }) => e.message).join('; ')); } - const record = res?.data.uiapi?.AccountCreate?.Record; + const record = res?.data?.uiapi?.AccountCreate?.Record; if (!record) throw new Error('No record returned from AccountCreate'); setResult({ Id: record.Id, Name: record.Name?.value }); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/DeleteRecord.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/DeleteRecord.test.tsx index b12ebe6..efde842 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/DeleteRecord.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/DeleteRecord.test.tsx @@ -6,11 +6,11 @@ import { render, screen, waitFor } from '@testing-library/react'; import { type Mock } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import DeleteRecord from './DeleteRecord'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -52,7 +52,7 @@ describe('DeleteRecord', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { @@ -123,7 +123,7 @@ describe('DeleteRecord', () => { expect(screen.queryByText('Acme Corp')).not.toBeInTheDocument() ); expect(mockGraphql).toHaveBeenLastCalledWith({ - query: expect.any(String), + mutation: expect.any(String), variables: expect.objectContaining({ input: { Id: '001' } }), }); }); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/DeleteRecord.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/DeleteRecord.tsx index c6548b5..1f4090f 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/DeleteRecord.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/DeleteRecord.tsx @@ -11,7 +11,7 @@ * @see QueryMutationTogether — inline editing with read-then-write cycle */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Button } from '@/components/ui/button'; // ── Read: load Accounts to display ─────────────────────────────────────────── @@ -90,11 +90,11 @@ export default function DeleteRecord() { (async () => { try { const sdk = await createDataSDK(); - const res = await sdk.graphql?.({ query: LIST_QUERY }); + const res = await sdk.graphql?.query({ query: LIST_QUERY }); if (res?.errors?.length) { throw new Error(res.errors.map((e: { message: string }) => e.message).join('; ')); } - const nodes = (res?.data.uiapi?.query?.Account?.edges ?? []) + const nodes = (res?.data?.uiapi?.query?.Account?.edges ?? []) .map(edge => edge?.node) .filter((n): n is Account => n != null); setAccounts(nodes); @@ -112,8 +112,8 @@ export default function DeleteRecord() { try { const sdk = await createDataSDK(); - const res = await sdk.graphql?.({ - query: DELETE_MUTATION, + const res = await sdk.graphql?.mutate({ + mutation: DELETE_MUTATION, variables: { input: { Id: id } }, }); if (res?.errors?.length) { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/QueryMutationTogether.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/QueryMutationTogether.test.tsx index 00be5b2..708422a 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/QueryMutationTogether.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/QueryMutationTogether.test.tsx @@ -5,11 +5,11 @@ import { render, screen, waitFor } from '@testing-library/react'; import { type Mock } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import QueryMutationTogether from './QueryMutationTogether'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -61,7 +61,7 @@ describe('QueryMutationTogether', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { @@ -141,7 +141,7 @@ describe('QueryMutationTogether', () => { expect(screen.queryByRole('button', { name: 'Save' })).not.toBeInTheDocument() ); expect(mockGraphql).toHaveBeenLastCalledWith({ - query: expect.any(String), + mutation: expect.any(String), variables: expect.objectContaining({ input: expect.objectContaining({ Id: '001' }), }), diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/QueryMutationTogether.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/QueryMutationTogether.tsx index 122cf7b..66aeea5 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/QueryMutationTogether.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/QueryMutationTogether.tsx @@ -16,7 +16,7 @@ * @see ServerErrorHandling — handling mutation errors from the server */ import { useEffect, useState, type FormEvent } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; @@ -143,11 +143,11 @@ export default function QueryMutationTogether() { (async () => { try { const sdk = await createDataSDK(); - const res = await sdk.graphql?.({ query: LIST_QUERY }); + const res = await sdk.graphql?.query({ query: LIST_QUERY }); if (res?.errors?.length) { throw new Error(res.errors.map((e: { message: string }) => e.message).join('; ')); } - const nodes = (res?.data.uiapi?.query?.Account?.edges ?? []) + const nodes = (res?.data?.uiapi?.query?.Account?.edges ?? []) .map(edge => edge?.node) .filter((n): n is Account => n != null); setAccounts(nodes); @@ -180,8 +180,8 @@ export default function QueryMutationTogether() { try { const sdk = await createDataSDK(); - const res = await sdk.graphql?.({ - query: UPDATE_MUTATION, + const res = await sdk.graphql?.mutate({ + mutation: UPDATE_MUTATION, variables: { input: { Id: editId, @@ -194,7 +194,7 @@ export default function QueryMutationTogether() { throw new Error(res.errors.map((e: { message: string }) => e.message).join('; ')); } - const record = res?.data.uiapi?.AccountUpdate?.Record; + const record = res?.data?.uiapi?.AccountUpdate?.Record; if (!record) throw new Error('No record returned from AccountUpdate'); // Update the single row in local state using the server response — diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/ServerErrorHandling.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/ServerErrorHandling.test.tsx index 80d97f0..3dbca4e 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/ServerErrorHandling.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/ServerErrorHandling.test.tsx @@ -6,11 +6,11 @@ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import ServerErrorHandling from './ServerErrorHandling'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -19,7 +19,7 @@ describe('ServerErrorHandling', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/ServerErrorHandling.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/ServerErrorHandling.tsx index dfeef6b..9f196f2 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/ServerErrorHandling.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/ServerErrorHandling.tsx @@ -17,7 +17,7 @@ * @see LoadingErrorEmpty — handling loading, error, and empty UI states */ import { useState, type FormEvent } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; @@ -60,8 +60,8 @@ export default function ServerErrorHandling() { try { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ - query: CREATE_CONTACT, + const result = await sdk.graphql?.mutate({ + mutation: CREATE_CONTACT, variables: { input: { Contact: { @@ -80,7 +80,7 @@ export default function ServerErrorHandling() { return; } - const payload = result?.data.uiapi?.ContactCreate; + const payload = result?.data?.uiapi?.ContactCreate; // Success: no top-level errors setCreatedId(payload?.Record?.Id); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/UpdateRecord.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/UpdateRecord.test.tsx index 0e565c4..4e13a31 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/UpdateRecord.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/UpdateRecord.test.tsx @@ -6,11 +6,11 @@ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import UpdateRecord from './UpdateRecord'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -55,7 +55,7 @@ describe('UpdateRecord', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { @@ -128,7 +128,7 @@ describe('UpdateRecord', () => { // Id is a top-level field on the input, not nested inside Account — // verify the correct shape is sent to the mutation. expect(mockGraphql).toHaveBeenLastCalledWith({ - query: expect.any(String), + mutation: expect.any(String), variables: expect.objectContaining({ input: expect.objectContaining({ Id: '001' }), }), diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/UpdateRecord.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/UpdateRecord.tsx index df8784d..778908e 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/UpdateRecord.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/modify-data/UpdateRecord.tsx @@ -11,7 +11,7 @@ * @see DeleteRecord — removing records with a confirmation pattern */ import { useEffect, useState, type FormEvent } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; @@ -130,11 +130,11 @@ export default function UpdateRecord() { (async () => { try { const sdk = await createDataSDK(); - const res = await sdk.graphql?.({ query: LOAD_QUERY }); + const res = await sdk.graphql?.query({ query: LOAD_QUERY }); if (res?.errors?.length) { throw new Error(res.errors.map((e: { message: string }) => e.message).join('; ')); } - const node = res?.data.uiapi?.query?.Account?.edges?.[0]?.node; + const node = res?.data?.uiapi?.query?.Account?.edges?.[0]?.node; if (node) { setAccountId(node.Id); setName(node.Name?.value ?? ''); @@ -158,8 +158,8 @@ export default function UpdateRecord() { try { const sdk = await createDataSDK(); - const res = await sdk.graphql?.({ - query: UPDATE_MUTATION, + const res = await sdk.graphql?.mutate({ + mutation: UPDATE_MUTATION, variables: { // Id is a top-level field on the input, not nested inside Account input: { Id: accountId, Account: { Name: name, Industry: industry } }, @@ -170,7 +170,7 @@ export default function UpdateRecord() { throw new Error(res.errors.map((e: { message: string }) => e.message).join('; ')); } - const record = res?.data.uiapi?.AccountUpdate?.Record; + const record = res?.data?.uiapi?.AccountUpdate?.Record; if (!record) throw new Error('No record returned from AccountUpdate'); // Sync local state with values returned from the server response diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/AliasedMultiObjectQuery.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/AliasedMultiObjectQuery.test.tsx index ff5fc2d..7bab8f7 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/AliasedMultiObjectQuery.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/AliasedMultiObjectQuery.test.tsx @@ -6,11 +6,11 @@ */ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import AliasedMultiObjectQuery from './AliasedMultiObjectQuery'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -35,7 +35,7 @@ describe('AliasedMultiObjectQuery', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/AliasedMultiObjectQuery.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/AliasedMultiObjectQuery.tsx index 46acf0f..475a8f9 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/AliasedMultiObjectQuery.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/AliasedMultiObjectQuery.tsx @@ -17,7 +17,7 @@ * @see ImperativeRefetch — re-fetching data on demand */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; // Aliases (accounts: Account, contacts: Contact) let us query two objects // in one round-trip. Each alias becomes a key in the response data. @@ -68,7 +68,7 @@ export default function AliasedMultiObjectQuery() { useEffect(() => { const fetchCounts = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/FilteredList.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/FilteredList.test.tsx index 5d0a694..c696e79 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/FilteredList.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/FilteredList.test.tsx @@ -6,11 +6,11 @@ */ import { render, screen, fireEvent, act } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import FilteredList from './FilteredList'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -42,7 +42,7 @@ describe('FilteredList', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); vi.useFakeTimers(); }); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/FilteredList.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/FilteredList.tsx index 0f0d719..e57218d 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/FilteredList.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/FilteredList.tsx @@ -12,7 +12,7 @@ */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar'; import { Input } from '@/components/ui/input'; @@ -94,7 +94,7 @@ export default function FilteredList() { const fetchFiltered = async () => { const sdk = await createDataSDK(); // Wrap the search term in % wildcards for the `like` operator - const result = await sdk.graphql?.({ + const result = await sdk.graphql?.query({ query: QUERY, variables: { name: `%${search}%` }, }); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ImperativeRefetch.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ImperativeRefetch.test.tsx index 48fd819..0a33a78 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ImperativeRefetch.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ImperativeRefetch.test.tsx @@ -7,11 +7,11 @@ import { render, screen, fireEvent } from '@testing-library/react'; import { type Mock } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import ImperativeRefetch from './ImperativeRefetch'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -41,7 +41,7 @@ describe('ImperativeRefetch', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ImperativeRefetch.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ImperativeRefetch.tsx index 043f220..3f7b436 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ImperativeRefetch.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ImperativeRefetch.tsx @@ -13,7 +13,7 @@ * @see CreateRecord — creating new records with GraphQL mutations */ import { useEffect, useState, useCallback } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Button } from '@/components/ui/button'; const QUERY = gql` @@ -73,7 +73,7 @@ export default function ImperativeRefetch() { try { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ListOfRecords.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ListOfRecords.test.tsx index c4aa424..a9dcb33 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ListOfRecords.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ListOfRecords.test.tsx @@ -6,11 +6,11 @@ */ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import ListOfRecords from './ListOfRecords'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -51,7 +51,7 @@ describe('ListOfRecords', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ListOfRecords.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ListOfRecords.tsx index 93443c5..5582f0c 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ListOfRecords.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/ListOfRecords.tsx @@ -12,7 +12,7 @@ * @see FilteredList — adding a search filter with GraphQL variables */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; // Relay connection pattern: the response wraps records in edges[].node. const QUERY = gql` @@ -82,7 +82,7 @@ export default function ListOfRecords() { useEffect(() => { const fetchContacts = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/PaginatedList.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/PaginatedList.test.tsx index 816c89a..a3fec05 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/PaginatedList.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/PaginatedList.test.tsx @@ -7,11 +7,11 @@ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import PaginatedList from './PaginatedList'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -100,7 +100,7 @@ describe('PaginatedList', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/PaginatedList.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/PaginatedList.tsx index 3629712..ba04791 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/PaginatedList.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/PaginatedList.tsx @@ -17,7 +17,7 @@ * @see RelatedRecords — traversing parent-child relationships */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Button } from '@/components/ui/button'; // The $after variable is a cursor string returned by pageInfo.endCursor. @@ -87,7 +87,7 @@ export default function PaginatedList() { const sdk = await createDataSDK(); // Pass the cursor as a GraphQL variable — omit for the first page const variables = after ? { after } : {}; - const result = await sdk.graphql?.({ + const result = await sdk.graphql?.query({ query: QUERY, variables, }); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/RelatedRecords.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/RelatedRecords.test.tsx index 33184ec..c1174a1 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/RelatedRecords.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/RelatedRecords.test.tsx @@ -6,11 +6,11 @@ */ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import RelatedRecords from './RelatedRecords'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -49,7 +49,7 @@ describe('RelatedRecords', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/RelatedRecords.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/RelatedRecords.tsx index 491f76e..353658f 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/RelatedRecords.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/RelatedRecords.tsx @@ -16,7 +16,7 @@ * @see AliasedMultiObjectQuery — querying multiple objects in one request */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; // To traverse a lookup, nest the parent object's fields under the // relationship name. Here Contact.AccountId becomes `Account { Name { value } }`. @@ -81,7 +81,7 @@ export default function RelatedRecords() { useEffect(() => { const fetchContacts = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SingleRecord.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SingleRecord.test.tsx index 2c57470..a18adb5 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SingleRecord.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SingleRecord.test.tsx @@ -6,11 +6,11 @@ */ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import SingleRecord from './SingleRecord'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -42,7 +42,7 @@ describe('SingleRecord', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SingleRecord.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SingleRecord.tsx index a411f94..42c48f2 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SingleRecord.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SingleRecord.tsx @@ -12,7 +12,7 @@ * @see ListOfRecords — querying multiple records */ import { useEffect, useState } from 'react'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar'; // UIAPI GraphQL wraps every query under uiapi.query.. @@ -88,7 +88,7 @@ export default function SingleRecord() { useEffect(() => { const fetchContact = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); // GraphQL errors don't throw — they're returned in the errors array // alongside partial data. Always check before reading data. diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SortedResults.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SortedResults.test.tsx index aeb9917..31c527f 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SortedResults.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SortedResults.test.tsx @@ -7,11 +7,11 @@ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import SortedResults from './SortedResults'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -48,7 +48,7 @@ describe('SortedResults', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SortedResults.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SortedResults.tsx index 374a07f..c2622a2 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SortedResults.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/read-data/SortedResults.tsx @@ -13,7 +13,7 @@ */ import { useEffect, useState } from 'react'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; type SortField = 'Name' | 'Title' | 'Phone'; type SortDir = 'ASC' | 'DESC'; @@ -87,7 +87,7 @@ export default function SortedResults() { const fetchSorted = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ + const result = await sdk.graphql?.query({ query: buildQuery(field, dir), }); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/NestedRoutes.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/NestedRoutes.test.tsx index ab9a4e7..963e69e 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/NestedRoutes.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/NestedRoutes.test.tsx @@ -9,14 +9,14 @@ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; import { MemoryRouter, Outlet, Route, Routes } from 'react-router'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import NestedRoutes, { NestedRoutesIndex, NestedRoutesDetail, } from './NestedRoutes'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -49,7 +49,7 @@ describe('NestedRoutes (layout)', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/NestedRoutes.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/NestedRoutes.tsx index 6af649d..bff4b48 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/NestedRoutes.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/NestedRoutes.tsx @@ -18,7 +18,7 @@ */ import { useEffect, useState } from 'react'; import { Link, Outlet, useOutletContext, useParams } from 'react-router'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; const QUERY = gql` query AccountsForNesting { @@ -71,7 +71,7 @@ export default function NestedRoutes() { useEffect(() => { const fetchAccounts = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: QUERY }); + const result = await sdk.graphql?.query({ query: QUERY }); if (result?.errors?.length) { throw new Error( diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/RouteParameters.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/RouteParameters.test.tsx index 946fd10..11a2dcc 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/RouteParameters.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/RouteParameters.test.tsx @@ -5,14 +5,14 @@ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; import { MemoryRouter, Route, Routes } from 'react-router'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import { RouteParametersList, RouteParametersDetail, } from './RouteParameters'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), gql: (strings: TemplateStringsArray) => strings.join(''), })); @@ -72,7 +72,7 @@ describe('RouteParametersList', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { @@ -122,7 +122,7 @@ describe('RouteParametersDetail', () => { const mockGraphql = vi.fn(); beforeEach(() => { - (createDataSDK as Mock).mockResolvedValue({ graphql: mockGraphql }); + (createDataSDK as Mock).mockResolvedValue({ graphql: { query: mockGraphql, mutate: mockGraphql } }); }); afterEach(() => { diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/RouteParameters.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/RouteParameters.tsx index 676484d..d7965c4 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/RouteParameters.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/routing/RouteParameters.tsx @@ -16,7 +16,7 @@ */ import { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router'; -import { createDataSDK, gql } from '@salesforce/sdk-data'; +import { createDataSDK, gql } from '@salesforce/platform-sdk'; const LIST_QUERY = gql` query AccountsForRouting { @@ -113,7 +113,7 @@ export function RouteParametersList() { useEffect(() => { const fetch = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ query: LIST_QUERY }); + const result = await sdk.graphql?.query({ query: LIST_QUERY }); if (result?.errors?.length) { throw new Error( @@ -177,7 +177,7 @@ export function RouteParametersDetail() { const fetch = async () => { const sdk = await createDataSDK(); - const result = await sdk.graphql?.({ + const result = await sdk.graphql?.query({ query: DETAIL_QUERY, variables: { id: accountId }, }); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ApexRest.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ApexRest.test.tsx index 65441b1..0d3af76 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ApexRest.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ApexRest.test.tsx @@ -9,11 +9,11 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import ApexRest from './ApexRest'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), })); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ApexRest.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ApexRest.tsx index c809161..bf7eb54 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ApexRest.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ApexRest.tsx @@ -11,7 +11,7 @@ * @see UiApiRest — using the UI API REST endpoints directly */ import { useState, type FormEvent } from 'react'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Avatar, AvatarImage } from '@/components/ui/avatar'; diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ConnectApi.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ConnectApi.test.tsx index 2304475..bccb3bc 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ConnectApi.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ConnectApi.test.tsx @@ -7,11 +7,11 @@ */ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import ConnectApi from './ConnectApi'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), })); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ConnectApi.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ConnectApi.tsx index c1a5159..40110b7 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ConnectApi.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/ConnectApi.tsx @@ -11,7 +11,7 @@ * @see ApexRest — calling custom Apex REST endpoints */ import { useEffect, useState } from 'react'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar'; // Minimal shape of a Chatter feed-elements response diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/DisplayCurrentUser.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/DisplayCurrentUser.test.tsx index 710131a..4a27df8 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/DisplayCurrentUser.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/DisplayCurrentUser.test.tsx @@ -3,11 +3,11 @@ */ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import DisplayCurrentUser from './DisplayCurrentUser'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), })); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/DisplayCurrentUser.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/DisplayCurrentUser.tsx index 60f6b91..98c1efb 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/DisplayCurrentUser.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/DisplayCurrentUser.tsx @@ -11,7 +11,7 @@ * @see ConnectApi — fetching Chatter feed data via Connect API */ import { useEffect, useState } from 'react'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; interface ChatterUser { displayName: string; diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/UiApiRest.test.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/UiApiRest.test.tsx index 681ee4b..bcfcf43 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/UiApiRest.test.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/UiApiRest.test.tsx @@ -4,11 +4,11 @@ */ import { render, screen } from '@testing-library/react'; import { type Mock } from 'vitest'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { axe } from 'vitest-axe'; import UiApiRest from './UiApiRest'; -vi.mock('@salesforce/sdk-data', () => ({ +vi.mock('@salesforce/platform-sdk', () => ({ createDataSDK: vi.fn(), })); diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/UiApiRest.tsx b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/UiApiRest.tsx index 5839bc3..7478b0c 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/UiApiRest.tsx +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/src/recipes/salesforce-apis/UiApiRest.tsx @@ -13,7 +13,7 @@ * @see ButtonSLDS — styling with SLDS blueprint CSS classes */ import { useEffect, useState } from 'react'; -import { createDataSDK } from '@salesforce/sdk-data'; +import { createDataSDK } from '@salesforce/platform-sdk'; import { Avatar, AvatarImage } from '@/components/ui/avatar'; // UI API list-ui response shape diff --git a/force-app/main/react-recipes/uiBundles/reactRecipes/tsconfig.json b/force-app/main/react-recipes/uiBundles/reactRecipes/tsconfig.json index 3fc46eb..1e148d5 100644 --- a/force-app/main/react-recipes/uiBundles/reactRecipes/tsconfig.json +++ b/force-app/main/react-recipes/uiBundles/reactRecipes/tsconfig.json @@ -12,7 +12,6 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "allowJs": true, "jsx": "react-jsx", /* Linting */