@salesforce/vite-plugin-lwc-ui-bundle 1.134.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,7 +21,7 @@ bundle, so the guard short-circuits and real host calls run.
21
21
 
22
22
  Do **not** expect `npm run build && open dist/index.html` to render mock
23
23
  data. Rollup hoists module-init code to the top of the bundle, which
24
- means `@salesforce/sdk-chat`'s `detectSurface()` runs _before_ the
24
+ means `@salesforce/platform-sdk-chat`'s `detectSurface()` runs _before_ the
25
25
  `main.js` / `bootstrap.js` body executes the `if (!window.openai?.
26
26
  callTool)` block. The SDK caches surface = `"WebApp"` and never observes
27
27
  the mock — LDS / graphql wire adapters silently return empty data.
@@ -33,53 +33,31 @@ Prerelease tags get unpublished from the registry over time.
33
33
  `npm view <pkg> version` and pin to `^<that>` instead of copying from
34
34
  the snippet.
35
35
 
36
- ## 3. Hand-rolled `lightningGraphql` in `vite.config.js`
36
+ ## 3. Hand-rolled GraphQL or LDS providers in `vite.config.js`
37
37
 
38
- **Symptom:** `@wire(graphql)` returns empty data; console shows
39
- `No window.openai.callTool available` or a hand-written
40
- `[lightningGraphql] ...` log message.
38
+ **Symptom:** `@wire(graphql)` or `@wire(getRecord)` returns empty data;
39
+ console shows `No window.openai.callTool available` or a hand-written
40
+ `[graphql] ...` / `[lds] ...` log message.
41
41
 
42
- **Cause:** The generator treated the "include `builtins.lightningGraphql()`"
43
- instruction as "write a provider called `lightningGraphql`" and inlined
44
- a custom provider factory in `vite.config.js` instead of importing
45
- `builtins` from the plugin. The hand-rolled version bypasses the
46
- plugin's real runtime (which handles `globalThis.__sfdc_sdk__`,
47
- `getChatSDK()`, and `normalizeMcpResponse`).
42
+ **Cause:** The generator treated the "include `builtins.lds()`"
43
+ instruction as "write a provider called `lds`" and inlined a custom
44
+ provider factory in `vite.config.js` instead of importing `builtins`
45
+ from the plugin. The hand-rolled version bypasses the plugin's real
46
+ runtime (which handles `getChatSDK()` MCP dispatch, `normalizeMcpResponse`
47
+ envelope parsing, and the graphql-specific `{ data, errors[] }`
48
+ envelope).
48
49
 
49
50
  **Fix:** Replace with:
50
51
 
51
52
  ```js
52
53
  import lwcVitePlugin, { builtins } from "@salesforce/vite-plugin-lwc-ui-bundle";
53
54
  // inside lwcVitePlugin({ providers: [...] })
54
- builtins.lightningGraphql(),
55
- builtins.lds(),
55
+ builtins.lds(), // covers lightning/uiRecordApi, uiObjectInfoApi, and lightning/graphql
56
56
  ```
57
57
 
58
- Same rule for `lds` and every other provider — never hand-write them.
58
+ Same rule for every other provider — never hand-write them.
59
59
 
60
- ## 4. `this`-binding bug in `lightning/graphql` runtime
61
-
62
- **Symptom:** `@wire(graphql)` with a class-based SDK (e.g.
63
- `@salesforce/sdk-data`'s `WebApp`) silently emits
64
- `{data: undefined, errors: [TypeError]}`; component falls through to an
65
- empty state.
66
-
67
- **Cause:** Plugin versions ≤ 1.132.0 destructure `graphql` off
68
- `globalThis.__sfdc_sdk__` before calling it, which loses the method's
69
- `this` binding. The method internally calls `this.fetch(...)` and
70
- blows up.
71
-
72
- **Fix:** Fixed in webapps PR #477 (plugin version > 1.132.0). Until the
73
- fix ships in a release, add this to `bootstrap.js` after creating the
74
- SDK:
75
-
76
- ```js
77
- sdk.graphql = sdk.graphql.bind(sdk);
78
- sdk.fetch = sdk.fetch.bind(sdk);
79
- globalThis.__sfdc_sdk__ = sdk;
80
- ```
81
-
82
- ## 5. Wrong tool name in mock branch (graphql foot-gun)
60
+ ## 4. Wrong tool name in mock branch (graphql foot-gun)
83
61
 
84
62
  **Symptom:** `@wire(graphql)` returns empty data even though the mock
85
63
  shim is installed; console shows "[mock] unhandled tool: graphqlQuery"
@@ -93,8 +71,13 @@ variables })` by default, but the mock branches on `"graphql"` or
93
71
  the same custom name to both the provider and the mock:
94
72
 
95
73
  ```js
96
- // vite.config.js
97
- builtins.lightningGraphql({ toolName: "myCustomGraphql" }),
74
+ // vite.config.js — override the default "graphqlQuery" tool name
75
+ builtins.lds({
76
+ "lightning/graphql": {
77
+ graphql: { type: "graphql-wire", mcp: { toolName: "myCustomGraphql" } },
78
+ executeMutation: { type: "graphql-mutation", mcp: { toolName: "myCustomGraphql" } },
79
+ },
80
+ }),
98
81
 
99
82
  // bootstrap.js
100
83
  if (name === "myCustomGraphql") { /* ... */ }
@@ -103,7 +86,7 @@ if (name === "myCustomGraphql") { /* ... */ }
103
86
  The vite-config tool name and the mock-branch string must match
104
87
  exactly.
105
88
 
106
- ## 6. `.properties` wrap in Avro/JSON-schema-serialized tool output
89
+ ## 5. `.properties` wrap in Avro/JSON-schema-serialized tool output
107
90
 
108
91
  **Symptom:** Chat wrapper renders "Waiting for tool output..." even
109
92
  though the host fired tool output; mapper's `Object.keys(records)[0]`
@@ -128,7 +111,7 @@ function unwrapPropertiesMap(value) {
128
111
 
129
112
  Apply this in every mapper that reads map-shaped fields.
130
113
 
131
- ## 7. Missing `viteSingleFile()`
114
+ ## 6. Missing `viteSingleFile()`
132
115
 
133
116
  **Symptom:** `dist/index.html` is 1-2 KB (just a stub); component
134
117
  doesn't render when opened locally.
@@ -155,7 +138,7 @@ build: {
155
138
 
156
139
  A correctly built `dist/index.html` is typically 100 KB+.
157
140
 
158
- ## 8. `@salesforce/label/...` warnings
141
+ ## 7. `@salesforce/label/...` warnings
159
142
 
160
143
  **Symptom:** Build warns `Unhandled import: @salesforce/label/...`,
161
144
  but the build succeeds.
@@ -166,7 +149,7 @@ when no override is provided.
166
149
  **Fix:** Not a bug. Add overrides to `builtins.label({...})` to
167
150
  customize the displayed text.
168
151
 
169
- ## 9. Missing gate / accessCheck providers with lightning-base-components
152
+ ## 8. Missing gate / accessCheck providers with lightning-base-components
170
153
 
171
154
  **Symptom:** Build fails with `Cannot read properties of undefined
172
155
  (reading 'isOpen')`.
@@ -179,7 +162,7 @@ import them.
179
162
  (and `builtins.primitiveUtils()`) whenever `lightning-base-components`
180
163
  is in the modules config.
181
164
 
182
- ## 10. Core-only imports
165
+ ## 9. Core-only imports
183
166
 
184
167
  **Symptom:** `Rollup failed to resolve import "force/someModule"` (or
185
168
  `aura`, `logger`, etc.).
@@ -198,14 +181,14 @@ lwcVitePlugin({
198
181
  Point the stub at a minimal file that exports the shape the importer
199
182
  expects.
200
183
 
201
- ## 11. Mock data doesn't work in production build
184
+ ## 10. Mock data doesn't work in production build
202
185
 
203
186
  **Symptom:** `npm run build && open dist/index.html` shows wrappers in
204
187
  "Waiting" state; `sdk.callTool is not available on this surface` in
205
188
  the console. Dev server (`npm run dev`) works fine.
206
189
 
207
190
  **Cause:** Rollup hoists module-init code to the top of the bundle.
208
- `@salesforce/sdk-chat`'s top-level `const surface = detectSurface()`
191
+ `@salesforce/platform-sdk-chat`'s top-level `const surface = detectSurface()`
209
192
  runs before `main.js` / `bootstrap.js` installs the mock, so the SDK
210
193
  caches `surface = "WebApp"` forever.
211
194
 
@@ -213,3 +196,128 @@ caches `surface = "WebApp"` forever.
213
196
  builds only target real MCP hosts (where the host sets `window.openai`
214
197
  before the bundle loads, so surface detection correctly resolves to
215
198
  `OpenAI`). See `bootstrap-js-patterns.md` for the full explanation.
199
+
200
+ ## 11. `providers` array missing entirely from `vite.config.js`
201
+
202
+ **Symptom:** Build succeeds, but:
203
+
204
+ - Labels render as `undefined` instead of their configured values
205
+ - `@wire(graphql)` returns `undefined` or silently no-ops
206
+ - `executeMutation()` fails with "No SDK found" or similar
207
+ - Console shows `[scoped-module-providers] Unhandled import: @salesforce/...`
208
+ lines for every scoped import
209
+
210
+ **Cause:** `lwcVitePlugin({ modules: {...} })` is called **without** a
211
+ `providers: [...]` array. The plugin loads and compiles LWC just fine,
212
+ but no scoped-module providers are registered — so every
213
+ `@salesforce/label/*`, `@salesforce/i18n/*`, `@salesforce/gate/*`,
214
+ `@salesforce/accessCheck/*`, `lightning/graphql`, `lightning/uiRecordApi`
215
+ import resolves to `undefined` at runtime.
216
+
217
+ **Fix:** Add the `providers: [...]` array with the appropriate builtins
218
+ for what the component tree actually uses:
219
+
220
+ ```js
221
+ import lwcVitePlugin, { builtins } from "@salesforce/vite-plugin-lwc-ui-bundle";
222
+
223
+ lwcVitePlugin({
224
+ modules: {
225
+ /* ... */
226
+ },
227
+ providers: [
228
+ builtins.label({
229
+ /* label overrides */
230
+ }),
231
+ builtins.i18n(),
232
+ builtins.client(),
233
+ // Required when using base components:
234
+ builtins.gate(),
235
+ builtins.accessCheck(),
236
+ builtins.primitiveUtils(),
237
+ // Add only if detected in the component tree:
238
+ builtins.lds(), // covers lightning/uiRecordApi and lightning/graphql
239
+ ],
240
+ });
241
+ ```
242
+
243
+ **Prevention:** SKILL.md Step 4.5 ("Verify existing `vite.config.js`
244
+ against findings") catches this by cross-checking Step 4's tree-walk
245
+ findings against the providers actually listed in the config.
246
+
247
+ ## 12. `lwc-components-lightning` vs `lightning-base-components`
248
+
249
+ **Symptom:** Config references one package name but the project has the
250
+ other installed, or provider behavior differs between environments.
251
+
252
+ **Cause:** Both names appear in the wild:
253
+
254
+ - `lightning-base-components` — the public npm package
255
+ - `lwc-components-lightning` — an internal-workspace name that some
256
+ Salesforce projects resolve through private registries, aliases, or
257
+ monorepo linking. The public-registry entry for this name is a
258
+ security-reserved placeholder, not a real package.
259
+
260
+ Both resolve to the same LWC base components and **require the same
261
+ scoped providers**: `builtins.gate()`, `builtins.accessCheck()`,
262
+ `builtins.primitiveUtils()`.
263
+
264
+ **Fix:** Use whichever package your project already depends on. For
265
+ public-facing consumers, use `lightning-base-components`. In either
266
+ case, make sure the three providers above are in the `providers` array
267
+ whenever the package name is in `modules.npm`.
268
+
269
+ ## 13. Missing `@conduit-client/*` peers for `builtins.lds()`
270
+
271
+ **Symptom:** `vite build` fails with:
272
+
273
+ ```
274
+ Rollup failed to resolve import "@conduit-client/service-bindings-imperative/v1"
275
+ from "\0sf-lds-adapter:lightning/graphql"
276
+ ```
277
+
278
+ (or `service-bindings-lwc`, or `utils` — errors cascade one at a time as
279
+ each is resolved.)
280
+
281
+ **Cause:** The plugin's LDS runtime
282
+ (`node_modules/@salesforce/vite-plugin-lwc-ui-bundle/dist/providers/lds/runtime.js`)
283
+ statically imports three `@conduit-client/*` packages. Depending on the
284
+ plugin version, these may be declared as the plugin's own
285
+ `dependencies` / `optionalDependencies`, or may be left undeclared (as
286
+ of `@salesforce/vite-plugin-lwc-ui-bundle@1.135.0`). The plugin reads
287
+ `runtime.js` as a string at init, so nothing resolves until a consumer
288
+ module imports `lightning/graphql`, `lightning/uiRecordApi`, or
289
+ `lightning/uiObjectInfoApi` — then Rollup has to resolve the
290
+ conduit-client imports in the consumer's `node_modules`, where they may
291
+ be missing.
292
+
293
+ The packages **are** publicly published on `registry.npmjs.org`; this
294
+ is a missing-peer-declaration issue in the plugin for the plugin
295
+ versions that don't ship them, not a registry / auth issue.
296
+
297
+ **Fix (consumer side, works against any plugin version):** when a
298
+ component actually imports `lightning/graphql`,
299
+ `lightning/uiRecordApi`, or `lightning/uiObjectInfoApi`, install the
300
+ three packages directly:
301
+
302
+ ```bash
303
+ npm install --save \
304
+ @conduit-client/service-bindings-imperative@^3 \
305
+ @conduit-client/service-bindings-lwc@^3 \
306
+ @conduit-client/utils@^3
307
+ ```
308
+
309
+ If no component imports those specifiers, the packages are not
310
+ needed — omit them AND omit `builtins.lds()` from the `providers`
311
+ array.
312
+
313
+ **Forward compatibility:** if a future plugin version adds these to its
314
+ own `dependencies` / `optionalDependencies`, they will already be
315
+ present after `npm install @salesforce/vite-plugin-lwc-ui-bundle` and
316
+ Step 8.1's post-install check becomes a no-op — it simply observes that
317
+ the packages are already resolvable and skips the additional install.
318
+ No skill change needed.
319
+
320
+ **Prevention:** SKILL.md Step 8.1 ("Verify LDS runtime peers") runs the
321
+ `require.resolve()` check after `npm install` and installs the three
322
+ packages only when they are actually missing AND the component tree
323
+ uses LDS specifiers.
@@ -1,10 +0,0 @@
1
- import { Provider } from '../../types';
2
- export interface LightningGraphqlOptions {
3
- /**
4
- * Name of the MCP tool to call for GraphQL query execution.
5
- * Defaults to `'graphqlQuery'`.
6
- */
7
- toolName?: string;
8
- }
9
- export declare function lightningGraphql(options?: LightningGraphqlOptions): Provider;
10
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/lightning-graphql/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,uBAAuB;IACvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAOD,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,QAAQ,CAUhF"}
@@ -1,24 +0,0 @@
1
- import { readFileSync } from "node:fs";
2
- import { join, dirname } from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- const runtimeSource = readFileSync(
5
- join(dirname(fileURLToPath(import.meta.url)), "runtime.js"),
6
- "utf-8"
7
- );
8
- function lightningGraphql(options = {}) {
9
- const toolName = options.toolName ?? "graphqlQuery";
10
- const source = `${runtimeSource}
11
- TOOL_NAME = ${JSON.stringify(toolName)};
12
- `;
13
- return {
14
- match: (id) => id === "lightning/graphql",
15
- resolve(specifier) {
16
- if (specifier !== "lightning/graphql") return null;
17
- return source;
18
- }
19
- };
20
- }
21
- export {
22
- lightningGraphql
23
- };
24
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/providers/lightning-graphql/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Provider } from \"../../types\";\n\nexport interface LightningGraphqlOptions {\n\t/**\n\t * Name of the MCP tool to call for GraphQL query execution.\n\t * Defaults to `'graphqlQuery'`.\n\t */\n\ttoolName?: string;\n}\n\nconst runtimeSource = readFileSync(\n\tjoin(dirname(fileURLToPath(import.meta.url)), \"runtime.js\"),\n\t\"utf-8\",\n);\n\nexport function lightningGraphql(options: LightningGraphqlOptions = {}): Provider {\n\tconst toolName = options.toolName ?? \"graphqlQuery\";\n\tconst source = `${runtimeSource}\\nTOOL_NAME = ${JSON.stringify(toolName)};\\n`;\n\treturn {\n\t\tmatch: (id) => id === \"lightning/graphql\",\n\t\tresolve(specifier) {\n\t\t\tif (specifier !== \"lightning/graphql\") return null;\n\t\t\treturn source;\n\t\t},\n\t};\n}\n"],"names":[],"mappings":";;;AAkBA,MAAM,gBAAgB;AAAA,EACrB,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,YAAY;AAAA,EAC1D;AACD;AAEO,SAAS,iBAAiB,UAAmC,IAAc;AACjF,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,SAAS,GAAG,aAAa;AAAA,cAAiB,KAAK,UAAU,QAAQ,CAAC;AAAA;AACxE,SAAO;AAAA,IACN,OAAO,CAAC,OAAO,OAAO;AAAA,IACtB,QAAQ,WAAW;AAClB,UAAI,cAAc,oBAAqB,QAAO;AAC9C,aAAO;AAAA,IACR;AAAA,EAAA;AAEF;"}
@@ -1,103 +0,0 @@
1
- import { getChatSDK } from "@salesforce/sdk-chat";
2
- function normalizeMcpResponse(raw) {
3
- if (raw && typeof raw === "object" && "structuredContent" in raw) {
4
- return raw.structuredContent;
5
- }
6
- if (raw && typeof raw === "object" && typeof raw.result === "string") {
7
- const parsed = JSON.parse(raw.result);
8
- if (Array.isArray(parsed)) {
9
- const textBlock = parsed.find(
10
- (b) => b && b.type === "text" && typeof b.text === "string"
11
- );
12
- const text = textBlock ? textBlock.text : null;
13
- if (text) {
14
- return JSON.parse(text);
15
- }
16
- return {};
17
- }
18
- return parsed;
19
- }
20
- return raw ?? {};
21
- }
22
- let TOOL_NAME = "graphqlQuery";
23
- function gql(strings, ...values) {
24
- let result = "";
25
- strings.forEach((string, i) => {
26
- result += string;
27
- if (i < values.length) result += String(values[i]);
28
- });
29
- return result;
30
- }
31
- async function runQuery(config) {
32
- const { query, variables } = config;
33
- if (!query) return { data: void 0, errors: void 0 };
34
- const sdkRef = globalThis.__sfdc_sdk__;
35
- if (sdkRef && typeof sdkRef.graphql === "function") {
36
- const result = await sdkRef.graphql({ query, variables: variables ?? {} });
37
- return { data: result?.data, errors: result?.errors };
38
- }
39
- const sdk = await getChatSDK();
40
- if (typeof sdk.callTool !== "function") {
41
- throw new Error(
42
- "[lightning/graphql] No data surface available. Either initialise globalThis.__sfdc_sdk__ with createDataSDK, or run inside a ChatGPT / MCP Apps context."
43
- );
44
- }
45
- const raw = await sdk.callTool({
46
- toolName: TOOL_NAME,
47
- params: { query, variables: variables ?? {} }
48
- });
49
- return normalizeMcpResponse(raw) ?? {};
50
- }
51
- class graphql {
52
- _dataCallback;
53
- _config;
54
- constructor(dataCallback) {
55
- this._dataCallback = dataCallback;
56
- }
57
- connect() {
58
- this._fetch();
59
- }
60
- // eslint-disable-next-line @typescript-eslint/no-empty-function
61
- disconnect() {
62
- }
63
- update(config) {
64
- this._config = config;
65
- this._fetch();
66
- }
67
- refresh() {
68
- return this._fetch();
69
- }
70
- async _fetch() {
71
- try {
72
- const result = await runQuery(this._config ?? {});
73
- this._emit(result);
74
- } catch (error) {
75
- this._emit({
76
- data: void 0,
77
- errors: [{ message: error.message }]
78
- });
79
- }
80
- }
81
- _emit({ data, errors }) {
82
- this._dataCallback({
83
- data,
84
- errors: errors?.length ? errors : void 0,
85
- refresh: () => this.refresh()
86
- });
87
- }
88
- }
89
- async function executeMutation(config) {
90
- if (!config?.query) return { data: void 0, errors: [{ message: "No query provided" }] };
91
- try {
92
- return await runQuery(config);
93
- } catch (error) {
94
- return { data: void 0, errors: [{ message: error.message }] };
95
- }
96
- }
97
- export {
98
- TOOL_NAME,
99
- executeMutation,
100
- gql,
101
- graphql
102
- };
103
- //# sourceMappingURL=runtime.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime.js","sources":["../../../src/providers/shared/normalize-mcp-response.ts","../../../src/providers/lightning-graphql/runtime.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\n\n/**\n * Unwraps the MCP tool transport envelope and returns the tool's payload as-is.\n *\n * Handles the three surface shapes `sdk.callTool()` can resolve with:\n * - MCP Apps surface: `{ structuredContent, content }`\n * - OpenAI surface: `{ result: \"<JSON string>\" }`, where the JSON may itself be\n * an MCP content array (`[{ type: 'text', text: \"<JSON string>\" }, ...]`)\n * - Fallback: the raw value returned by `callTool`\n *\n * The shape of the unwrapped payload is the tool's responsibility — this helper\n * does not project out `data` / `error` / `errors`. Callers read whichever keys\n * their tool contract defines.\n */\nexport function normalizeMcpResponse(raw: unknown): unknown {\n\tif (raw && typeof raw === \"object\" && \"structuredContent\" in raw) {\n\t\treturn (raw as { structuredContent: unknown }).structuredContent;\n\t}\n\n\tif (raw && typeof raw === \"object\" && typeof (raw as { result?: unknown }).result === \"string\") {\n\t\tconst parsed = JSON.parse((raw as { result: string }).result);\n\t\tif (Array.isArray(parsed)) {\n\t\t\tconst textBlock = parsed.find(\n\t\t\t\t(b: { type?: string; text?: string }) =>\n\t\t\t\t\tb && b.type === \"text\" && typeof b.text === \"string\",\n\t\t\t);\n\t\t\tconst text = textBlock ? textBlock.text : null;\n\t\t\tif (text) {\n\t\t\t\treturn JSON.parse(text);\n\t\t\t}\n\t\t\treturn {};\n\t\t}\n\t\treturn parsed;\n\t}\n\n\treturn raw ?? {};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { getChatSDK } from \"@salesforce/sdk-chat\";\nimport { normalizeMcpResponse } from \"../shared/normalize-mcp-response\";\n\n// Overwritten at plugin-load time by the `lightningGraphql` Vite shim, which\n// appends `TOOL_NAME = \"<configured-name>\";` to the bundled output. The initial\n// value is the default.\n// eslint-disable-next-line prefer-const\nexport let TOOL_NAME = \"graphqlQuery\";\n\ninterface GraphqlConfig {\n\tquery?: string;\n\tvariables?: Record<string, unknown>;\n}\n\ninterface GraphqlResult {\n\tdata?: unknown;\n\terrors?: { message: string }[];\n}\n\ntype WireCallback = (result: {\n\tdata: unknown;\n\terrors: { message: string }[] | undefined;\n\trefresh: () => Promise<void>;\n}) => void;\n\nexport function gql(strings: TemplateStringsArray, ...values: unknown[]): string {\n\tlet result = \"\";\n\tstrings.forEach((string, i) => {\n\t\tresult += string;\n\t\tif (i < values.length) result += String(values[i]);\n\t});\n\treturn result;\n}\n\nasync function runQuery(config: GraphqlConfig): Promise<GraphqlResult> {\n\tconst { query, variables } = config;\n\tif (!query) return { data: undefined, errors: undefined };\n\n\t// 1. UIBundle / local dev: use globalThis.__sfdc_sdk__.graphql if available.\n\t// Invoke as a method (not a destructured reference) so class-based SDK\n\t// implementations keep their `this` binding — some SDKs implement\n\t// `graphql` as a method that calls `this.fetch(...)` internally.\n\tconst sdkRef = (globalThis as Record<string, unknown>).__sfdc_sdk__ as\n\t\t| {\n\t\t\t\tgraphql?: (args: {\n\t\t\t\t\tquery: string;\n\t\t\t\t\tvariables: Record<string, unknown>;\n\t\t\t\t}) => Promise<GraphqlResult>;\n\t\t }\n\t\t| undefined;\n\tif (sdkRef && typeof sdkRef.graphql === \"function\") {\n\t\tconst result = await sdkRef.graphql({ query, variables: variables ?? {} });\n\t\treturn { data: result?.data, errors: result?.errors };\n\t}\n\n\t// 2. MCP surface: use getChatSDK().callTool\n\tconst sdk = await getChatSDK();\n\tif (typeof sdk.callTool !== \"function\") {\n\t\tthrow new Error(\n\t\t\t\"[lightning/graphql] No data surface available. \" +\n\t\t\t\t\"Either initialise globalThis.__sfdc_sdk__ with createDataSDK, \" +\n\t\t\t\t\"or run inside a ChatGPT / MCP Apps context.\",\n\t\t);\n\t}\n\n\tconst raw = await sdk.callTool({\n\t\ttoolName: TOOL_NAME,\n\t\tparams: { query, variables: variables ?? {} },\n\t});\n\n\treturn (normalizeMcpResponse(raw) as GraphqlResult) ?? {};\n}\n\nexport class graphql {\n\t_dataCallback: WireCallback;\n\t_config: GraphqlConfig | undefined;\n\n\tconstructor(dataCallback: WireCallback) {\n\t\tthis._dataCallback = dataCallback;\n\t}\n\n\tconnect() {\n\t\tthis._fetch();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-empty-function\n\tdisconnect() {}\n\n\tupdate(config: GraphqlConfig) {\n\t\tthis._config = config;\n\t\tthis._fetch();\n\t}\n\n\trefresh() {\n\t\treturn this._fetch();\n\t}\n\n\tasync _fetch() {\n\t\ttry {\n\t\t\tconst result = await runQuery(this._config ?? {});\n\t\t\tthis._emit(result);\n\t\t} catch (error) {\n\t\t\tthis._emit({\n\t\t\t\tdata: undefined,\n\t\t\t\terrors: [{ message: (error as Error).message }],\n\t\t\t});\n\t\t}\n\t}\n\n\t_emit({ data, errors }: GraphqlResult) {\n\t\tthis._dataCallback({\n\t\t\tdata,\n\t\t\terrors: errors?.length ? errors : undefined,\n\t\t\trefresh: () => this.refresh(),\n\t\t});\n\t}\n}\n\nexport async function executeMutation(config: GraphqlConfig): Promise<GraphqlResult> {\n\tif (!config?.query) return { data: undefined, errors: [{ message: \"No query provided\" }] };\n\ttry {\n\t\treturn await runQuery(config);\n\t} catch (error) {\n\t\treturn { data: undefined, errors: [{ message: (error as Error).message }] };\n\t}\n}\n"],"names":[],"mappings":"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"}