@salesforce/vite-plugin-lwc-ui-bundle 9.16.1 → 9.17.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAOnC,OAAO,KAAK,gBAAgB,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAa,oBAAoB,EAA6B,MAAM,SAAS,CAAC;AAE1F,YAAY,EACX,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,SAAS,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gBAAgB,IAAI,QAAQ,EAAE,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAkCvD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM,EAAE,CA0JlF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAOnC,OAAO,KAAK,gBAAgB,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAEX,oBAAoB,EAIpB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACX,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,SAAS,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gBAAgB,IAAI,QAAQ,EAAE,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAkCvD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,MAAM,EAAE,CAkKlF"}
package/dist/index.js CHANGED
@@ -444,6 +444,9 @@ function lwcVitePlugin(options = {}) {
444
444
  interceptPrefixes.add(p.prefix.split("/")[0] + "/");
445
445
  }
446
446
  }
447
+ const pluginPassthroughRules = rawPlugins.flatMap(
448
+ (p) => p.passthroughRules ?? []
449
+ );
447
450
  const plugins = [
448
451
  {
449
452
  name: "vite-plugin-lwc-optimize-deps",
@@ -473,7 +476,7 @@ function lwcVitePlugin(options = {}) {
473
476
  scopedProviders(resolvedProviders, {
474
477
  ignorePatterns,
475
478
  interceptPrefixes: [...interceptPrefixes],
476
- passthroughRules
479
+ passthroughRules: [...passthroughRules, ...pluginPassthroughRules]
477
480
  }),
478
481
  ...npmRoots.map(
479
482
  (npmRoot) => lightningNpm({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/discovery.ts","../src/plugins/lightning-npm.ts","../src/plugins/lwc-bridge.ts","../src/plugins/lwc-wrapper.ts","../src/plugins/missing-css.ts","../src/plugins/scoped-providers.ts","../src/plugins/proxy.ts","../src/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 { existsSync, readdirSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { DirConfig, DiscoveredModule } from \"./types\";\n\nexport function discoverModules(dirs: (string | DirConfig)[] = []): DiscoveredModule[] {\n\tconst modules: DiscoveredModule[] = [];\n\n\tfor (const dir of dirs) {\n\t\tconst dirPath = typeof dir === \"string\" ? dir : dir.path;\n\t\tconst namespace = typeof dir === \"string\" ? undefined : dir.namespace;\n\t\tconst resolvedDir = path.resolve(dirPath);\n\n\t\tif (!existsSync(resolvedDir) || !statSync(resolvedDir).isDirectory()) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (namespace) {\n\t\t\t// Flat DX structure: <dir>/<componentName>/<componentName>.js\n\t\t\tfor (const name of readdirSync(resolvedDir)) {\n\t\t\t\tconst fullPath = path.join(resolvedDir, name);\n\t\t\t\tif (!statSync(fullPath).isDirectory()) continue;\n\n\t\t\t\tconst entryPath = path.join(fullPath, `${name}.js`);\n\t\t\t\tif (existsSync(entryPath)) {\n\t\t\t\t\tmodules.push({\n\t\t\t\t\t\tname: `${namespace}/${name}`,\n\t\t\t\t\t\tpath: path.resolve(entryPath),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Standard structure: <dir>/<namespace>/<componentName>/<componentName>.js\n\t\t\tfor (const ns of readdirSync(resolvedDir)) {\n\t\t\t\tconst nsDir = path.join(resolvedDir, ns);\n\t\t\t\tif (!statSync(nsDir).isDirectory()) continue;\n\n\t\t\t\tfor (const name of readdirSync(nsDir)) {\n\t\t\t\t\tconst fullPath = path.join(nsDir, name);\n\t\t\t\t\tif (!statSync(fullPath).isDirectory()) continue;\n\n\t\t\t\t\tconst entryPath = path.join(fullPath, `${name}.js`);\n\t\t\t\t\tif (existsSync(entryPath)) {\n\t\t\t\t\t\tmodules.push({\n\t\t\t\t\t\t\tname: `${ns}/${name}`,\n\t\t\t\t\t\t\tpath: path.resolve(entryPath),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn modules;\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\nimport type { LightningNpmOptions } from \"../types\";\n\nfunction resolveJsFromRoot(root: string, sub: string): string | null {\n\tconst segments = sub.split(\"/\");\n\tconst leaf = segments[segments.length - 1];\n\tconst nested = path.join(root, ...segments, `${leaf}.js`);\n\tif (existsSync(nested)) return nested;\n\tconst flat = path.join(root, `${sub}.js`);\n\tif (existsSync(flat)) return flat;\n\treturn null;\n}\n\nfunction resolveCssFromRoot(root: string, sub: string): string | null {\n\tconst segments = sub.split(\"/\");\n\tconst leaf = segments[segments.length - 1];\n\tconst nested = path.join(root, ...segments, `${leaf}.css`);\n\treturn existsSync(nested) ? nested : null;\n}\n\nexport function lightningNpm({ npmRoot, overrideDirs = [] }: LightningNpmOptions): Plugin {\n\treturn {\n\t\tname: \"vite-plugin-resolve-lightning-npm\",\n\t\tenforce: \"pre\",\n\n\t\tresolveId(importee) {\n\t\t\tif (!importee.startsWith(\"lightning/\")) return null;\n\n\t\t\tconst sub = importee.slice(\"lightning/\".length);\n\t\t\tconst segments = sub.split(\"/\");\n\t\t\tconst leaf = segments[segments.length - 1];\n\n\t\t\tfor (const dir of overrideDirs) {\n\t\t\t\tconst overridePath = path.join(dir, ...segments, `${leaf}.js`);\n\t\t\t\tif (existsSync(overridePath)) return null;\n\t\t\t}\n\n\t\t\tconst npmJs = resolveJsFromRoot(npmRoot, sub);\n\t\t\tif (npmJs) return npmJs;\n\n\t\t\tfor (const dir of overrideDirs) {\n\t\t\t\tconst cssFallback = path.join(dir, ...segments, `${leaf}.css`);\n\t\t\t\tif (existsSync(cssFallback)) return cssFallback;\n\t\t\t}\n\n\t\t\treturn resolveCssFromRoot(npmRoot, sub);\n\t\t},\n\t};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nexport function lwcBridge(isComponentAsset: (id: string) => boolean): Plugin {\n\treturn {\n\t\tname: \"vite-plugin-lwc-bridge\",\n\t\tenforce: \"pre\",\n\n\t\tconfigResolved(config: ResolvedConfig) {\n\t\t\tfor (const plugin of config.plugins) {\n\t\t\t\tif (plugin.name === \"vite:css\" || plugin.name === \"vite:css-post\") {\n\t\t\t\t\tconst p = plugin as unknown as Record<string, unknown>;\n\t\t\t\t\tconst origTransform = p[\"transform\"];\n\t\t\t\t\tif (!origTransform) continue;\n\n\t\t\t\t\tif (typeof origTransform === \"function\") {\n\t\t\t\t\t\t// Vite <7: transform is a plain function\n\t\t\t\t\t\tp[\"transform\"] = function (\n\t\t\t\t\t\t\tthis: unknown,\n\t\t\t\t\t\t\tcode: string,\n\t\t\t\t\t\t\tid: string,\n\t\t\t\t\t\t\t...rest: unknown[]\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (isComponentAsset(id)) return;\n\t\t\t\t\t\t\treturn (origTransform as (...a: unknown[]) => unknown).call(this, code, id, ...rest);\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof origTransform === \"object\" &&\n\t\t\t\t\t\ttypeof (origTransform as Record<string, unknown>)[\"handler\"] === \"function\"\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Vite 7+: transform is { handler, order? }\n\t\t\t\t\t\tconst origHandler = (origTransform as Record<string, unknown>)[\"handler\"] as (\n\t\t\t\t\t\t\t...a: unknown[]\n\t\t\t\t\t\t) => unknown;\n\t\t\t\t\t\tp[\"transform\"] = {\n\t\t\t\t\t\t\t...(origTransform as object),\n\t\t\t\t\t\t\thandler: function (this: unknown, code: string, id: string, ...rest: unknown[]) {\n\t\t\t\t\t\t\t\tif (isComponentAsset(id)) return;\n\t\t\t\t\t\t\t\treturn origHandler.call(this, code, id, ...rest);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tresolveId(id, importer) {\n\t\t\tif (id.startsWith(\"@lwc/resources/\")) {\n\t\t\t\treturn id;\n\t\t\t}\n\n\t\t\tconst cleanId = id.split(\"?\", 2)[0] ?? id;\n\n\t\t\tif (cleanId.endsWith(\".html\") && isComponentAsset(cleanId) && !id.includes(\"?lwc\")) {\n\t\t\t\treturn `${cleanId}?lwc`;\n\t\t\t}\n\n\t\t\tif (!importer) return null;\n\t\t\tif (!cleanId.endsWith(\".html\")) return null;\n\t\t\tif (!cleanId.startsWith(\"./\") && !cleanId.startsWith(\"../\")) return null;\n\t\t\tif (!isComponentAsset(importer)) return null;\n\n\t\t\tconst resolved = path.resolve(path.dirname(importer.split(\"?\")[0] ?? importer), cleanId);\n\n\t\t\tif (existsSync(resolved)) {\n\t\t\t\treturn resolved + \"?lwc\";\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (id.startsWith(\"@lwc/resources/\")) {\n\t\t\t\treturn \"export default undefined;\";\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type { Plugin } from \"vite\";\n\ntype AnyFn = (this: unknown, ...args: unknown[]) => unknown;\ntype LwcRollupFactory = (options: Record<string, unknown>) => Plugin;\ntype LazyLwcRollupLoader = () => Promise<LwcRollupFactory>;\n\nexport function lwcWrapper(\n\tlazyLoader: LazyLwcRollupLoader,\n\toptions: Record<string, unknown>,\n\tisComponentAsset?: (id: string) => boolean,\n): Plugin {\n\tlet pluginPromise: Promise<Plugin> | null = null;\n\n\tconst getPlugin = () => {\n\t\tif (!pluginPromise) {\n\t\t\tpluginPromise = lazyLoader().then((factory) => factory(options));\n\t\t}\n\t\treturn pluginPromise;\n\t};\n\n\treturn {\n\t\tname: \"vite-plugin-lwc-wrapper\",\n\t\tenforce: \"pre\" as const,\n\t\tasync resolveId(importee: string, importer?: string) {\n\t\t\tif (importer?.split(\"?\")[0]?.endsWith(\"index.html\") && !importer.includes(\"html-proxy\"))\n\t\t\t\treturn null;\n\t\t\tif (importee.startsWith(\"/@\") || importee.startsWith(\"\\0\")) return null;\n\t\t\tif (importer?.includes(\"/node_modules/vite/\")) return null;\n\t\t\tconst plugin = await getPlugin();\n\t\t\treturn typeof plugin.resolveId === \"function\"\n\t\t\t\t? (plugin.resolveId as AnyFn).call(this, importee, importer)\n\t\t\t\t: null;\n\t\t},\n\t\tasync load(id: string) {\n\t\t\tconst plugin = await getPlugin();\n\t\t\treturn typeof plugin.load === \"function\" ? (plugin.load as AnyFn).call(this, id) : null;\n\t\t},\n\t\tasync transform(code: string, id: string) {\n\t\t\t// Only pass files to the LWC compiler if they are LWC component assets.\n\t\t\t// Non-component files (SDK sources, node_modules, etc.) must be skipped.\n\t\t\tif (isComponentAsset && !isComponentAsset(id)) return null;\n\t\t\tconst plugin = await getPlugin();\n\t\t\treturn typeof plugin.transform === \"function\"\n\t\t\t\t? (plugin.transform as AnyFn).call(this, code, id)\n\t\t\t\t: null;\n\t\t},\n\t} as Plugin;\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\n\nconst LWC_EMPTY_CSS = \"\\0lwc-empty-css\";\n\nexport function missingCss(): Plugin {\n\treturn {\n\t\tname: \"vite-plugin-lwc-missing-css\",\n\t\tenforce: \"pre\",\n\n\t\tresolveId(id, importer) {\n\t\t\tif (!importer || !id.startsWith(\"./\") || !id.includes(\".css\")) return null;\n\t\t\tconst importerPath = importer.split(\"?\")[0] ?? importer;\n\t\t\tif (!importerPath.endsWith(\".html\")) return null;\n\n\t\t\tconst resolved = path.resolve(path.dirname(importerPath), id.split(\"?\")[0] ?? id);\n\t\t\tif (existsSync(resolved)) return null;\n\n\t\t\treturn `${LWC_EMPTY_CSS}?${id}`;\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (id.startsWith(LWC_EMPTY_CSS)) {\n\t\t\t\treturn \"export default undefined\";\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type { Plugin } from \"vite\";\nimport type { Provider, ScopedProvidersOptions } from \"../types\";\n\nconst VIRTUAL_PREFIX = \"\\0sf-provider:\";\n\nexport function scopedProviders(\n\tproviders: Provider[] = [],\n\toptions: ScopedProvidersOptions = {},\n): Plugin {\n\tconst { ignorePatterns = [], interceptPrefixes = [], passthroughRules = [] } = options;\n\n\tconst prefixSet = new Set<string>();\n\tfor (const p of providers) {\n\t\tif (p.prefix) prefixSet.add(p.prefix);\n\t}\n\n\tfunction shouldIntercept(id: string): boolean {\n\t\tfor (const prefix of prefixSet) {\n\t\t\tif (id === prefix || id.startsWith(prefix)) return true;\n\t\t}\n\t\tfor (const prefix of interceptPrefixes) {\n\t\t\tif (id.startsWith(prefix)) return true;\n\t\t}\n\t\tfor (const p of providers) {\n\t\t\tif (!p.prefix && typeof p.match === \"function\" && p.match(id)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tname: \"vite-plugin-scoped-module-providers\",\n\t\tenforce: \"pre\",\n\n\t\tresolveId(id, importer) {\n\t\t\t// Explicit provider prefix always wins over ignorePatterns —\n\t\t\t// if a provider is registered for a specifier, it always handles it.\n\t\t\tconst handledByProvider = [...prefixSet].some((p) => id === p || id.startsWith(p + \"/\"));\n\n\t\t\tif (!handledByProvider) {\n\t\t\t\tif (!shouldIntercept(id)) return null;\n\n\t\t\t\tfor (const pattern of ignorePatterns) {\n\t\t\t\t\tif (id.startsWith(pattern)) return null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const rule of passthroughRules) {\n\t\t\t\tif (\n\t\t\t\t\timporter &&\n\t\t\t\t\tid.startsWith(rule.specifierPrefix) &&\n\t\t\t\t\timporter.includes(rule.importerPattern)\n\t\t\t\t) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn VIRTUAL_PREFIX + id;\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (!id.startsWith(VIRTUAL_PREFIX)) return null;\n\n\t\t\tconst specifier = id.slice(VIRTUAL_PREFIX.length);\n\n\t\t\tfor (const provider of providers) {\n\t\t\t\tconst result = provider.resolve(specifier);\n\t\t\t\tif (result != null) return result;\n\t\t\t}\n\n\t\t\tconsole.warn(\n\t\t\t\t`[scoped-module-providers] Unhandled import: ${specifier} — returning undefined`,\n\t\t\t);\n\t\t\treturn `export default undefined;`;\n\t\t},\n\t};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport * as http from \"node:http\";\nimport * as https from \"node:https\";\nimport type { Plugin } from \"vite\";\n\nexport interface LwcProxyOptions {\n\t/** Salesforce org alias (defaults to the sf CLI default org) */\n\torgAlias?: string;\n\t/** Enable verbose request logging */\n\tdebug?: boolean;\n}\n\n/**\n * Vite plugin that proxies Salesforce API calls to a connected org.\n *\n * Uses the same authentication approach as @salesforce/vite-plugin-ui-bundle —\n * reads credentials from the sf CLI via @salesforce/ui-bundle/app.\n *\n * Intercepts requests to /services/ and /lwr/ and forwards them to Salesforce\n * with the org's access token. Handles token refresh on 401/403 responses.\n *\n * Usage in vite.config.js:\n * import { lwcProxy } from '@salesforce/vite-plugin-lwc-ui-bundle';\n * plugins: [lwcVitePlugin(...), lwcProxy()]\n *\n * Then initialise the SDK in your app's bootstrap:\n * import { createDataSDK } from '@salesforce/platform-sdk';\n * globalThis.__sfdc_sdk__ = await createDataSDK({ uiBundle: { basePath: '/' } });\n */\nexport function lwcProxy(options: LwcProxyOptions = {}): Plugin {\n\tlet instanceUrl: string | undefined;\n\tlet accessToken: string | undefined;\n\tconst orgAlias: string | undefined = options.orgAlias;\n\n\tasync function loadOrgInfo(): Promise<void> {\n\t\ttry {\n\t\t\t// Dynamically import to avoid bundling @salesforce/ui-bundle at build time\n\t\t\tconst { getOrgInfo } = await import(\"@salesforce/ui-bundle/app\");\n\t\t\tconst info = await getOrgInfo(orgAlias);\n\t\t\tif (info) {\n\t\t\t\tinstanceUrl = info.rawInstanceUrl ?? info.instanceUrl;\n\t\t\t\taccessToken = info.accessToken;\n\t\t\t\tif (options.debug) {\n\t\t\t\t\tconsole.log(`[lwc-proxy] Connected to ${instanceUrl}`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst msg = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(\n\t\t\t\t`[lwc-proxy] Failed to load org info — is a Salesforce org connected?\\n ${msg}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync function refreshToken(): Promise<void> {\n\t\ttry {\n\t\t\tconst { refreshOrgAuth } = await import(\"@salesforce/ui-bundle/app\");\n\t\t\tconst info = await refreshOrgAuth(orgAlias ?? \"\");\n\t\t\tif (info) {\n\t\t\t\tinstanceUrl = info.rawInstanceUrl ?? info.instanceUrl;\n\t\t\t\taccessToken = info.accessToken;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore refresh errors\n\t\t}\n\t}\n\n\treturn {\n\t\tname: \"vite-plugin-lwc-proxy\",\n\t\tenforce: \"pre\",\n\n\t\tasync configResolved() {\n\t\t\tawait loadOrgInfo();\n\t\t},\n\n\t\tconfigureServer(server) {\n\t\t\tserver.middlewares.use(async (req, res, next) => {\n\t\t\t\tconst url = req.url ?? \"\";\n\n\t\t\t\t// Only proxy Salesforce API paths\n\t\t\t\tif (!url.startsWith(\"/services/\") && !url.startsWith(\"/lwr/\")) {\n\t\t\t\t\treturn next();\n\t\t\t\t}\n\n\t\t\t\tif (!instanceUrl || !accessToken) {\n\t\t\t\t\tres.writeHead(503, { \"Content-Type\": \"application/json\" });\n\t\t\t\t\tres.end(\n\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\terror: \"SERVICE_UNAVAILABLE\",\n\t\t\t\t\t\t\tmessage: \"Salesforce org not connected. Run: sf org display\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst forward = async (token: string): Promise<void> => {\n\t\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\t\tconst targetUrl = new URL(url, instanceUrl);\n\t\t\t\t\t\tconst isHttps = targetUrl.protocol === \"https:\";\n\t\t\t\t\t\tconst transport = isHttps ? https : http;\n\n\t\t\t\t\t\tif (options.debug) {\n\t\t\t\t\t\t\tconsole.log(`[lwc-proxy] ${req.method} ${url}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Strip hop-by-hop headers\n\t\t\t\t\t\tconst headers: Record<string, string | string[]> = {};\n\t\t\t\t\t\tfor (const [key, value] of Object.entries(req.headers)) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t![\n\t\t\t\t\t\t\t\t\t\"host\",\n\t\t\t\t\t\t\t\t\t\"connection\",\n\t\t\t\t\t\t\t\t\t\"keep-alive\",\n\t\t\t\t\t\t\t\t\t\"proxy-authenticate\",\n\t\t\t\t\t\t\t\t\t\"proxy-authorization\",\n\t\t\t\t\t\t\t\t\t\"te\",\n\t\t\t\t\t\t\t\t\t\"trailers\",\n\t\t\t\t\t\t\t\t\t\"transfer-encoding\",\n\t\t\t\t\t\t\t\t\t\"upgrade\",\n\t\t\t\t\t\t\t\t].includes(key.toLowerCase()) &&\n\t\t\t\t\t\t\t\tvalue !== undefined\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\theaders[key] = value as string | string[];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\theaders[\"host\"] = targetUrl.host;\n\t\t\t\t\t\theaders[\"authorization\"] = `Bearer ${token}`;\n\t\t\t\t\t\theaders[\"cookie\"] = `sid=${token}`;\n\n\t\t\t\t\t\tconst proxyReq = transport.request(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmethod: req.method,\n\t\t\t\t\t\t\t\thostname: targetUrl.hostname,\n\t\t\t\t\t\t\t\tport: targetUrl.port || (isHttps ? 443 : 80),\n\t\t\t\t\t\t\t\tpath: targetUrl.pathname + targetUrl.search,\n\t\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(proxyRes) => {\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\tres.writeHead(proxyRes.statusCode ?? 200, proxyRes.headers);\n\t\t\t\t\t\t\t\tproxyRes.pipe(res);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treq.pipe(proxyReq);\n\t\t\t\t\t\tproxyReq.on(\"error\", reject);\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\ttry {\n\t\t\t\t\tawait forward(accessToken!);\n\n\t\t\t\t\t// On 401/403, refresh token and retry once\n\t\t\t\t\t// Note: we can't easily check status here since we piped to res,\n\t\t\t\t\t// so we rely on the transform hook below for retries in future iterations\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (options.debug) {\n\t\t\t\t\t\tconsole.error(\"[lwc-proxy] Request failed:\", error);\n\t\t\t\t\t}\n\t\t\t\t\t// Try refreshing token and retry\n\t\t\t\t\tawait refreshToken();\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait forward(accessToken!);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tnext(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\nimport { discoverModules } from \"./discovery\";\nimport { lightningNpm } from \"./plugins/lightning-npm\";\nimport { lwcBridge } from \"./plugins/lwc-bridge\";\nimport { lwcWrapper } from \"./plugins/lwc-wrapper\";\nimport { missingCss } from \"./plugins/missing-css\";\nimport { scopedProviders } from \"./plugins/scoped-providers\";\nimport * as builtinProviders from \"./providers/index\";\nimport type { DirConfig, LwcVitePluginOptions, NpmModuleConfig, Provider } from \"./types\";\n\nexport type {\n\tProvider,\n\tLwcVitePluginOptions,\n\tPassthroughRule,\n\tDiscoveredModule,\n\tDirConfig,\n} from \"./types\";\nexport { builtinProviders as builtins };\nexport { discoverModules } from \"./discovery\";\nexport { lwcProxy } from \"./plugins/proxy\";\nexport type { LwcProxyOptions } from \"./plugins/proxy\";\n\nfunction defaultProviders(): (Provider | Plugin)[] {\n\treturn [\n\t\tbuiltinProviders.label(),\n\t\tbuiltinProviders.i18n(),\n\t\tbuiltinProviders.accessCheck(),\n\t\tbuiltinProviders.client(),\n\t\tbuiltinProviders.gate(),\n\t\tbuiltinProviders.primitiveUtils(),\n\t\tbuiltinProviders.lds(),\n\t];\n}\n\n/** Distinguishes a scoped-providers `Provider` from a raw Vite `Plugin`. */\nfunction isProvider(item: Provider | Plugin): item is Provider {\n\treturn typeof (item as Provider).resolve === \"function\";\n}\n\nasync function loadLwcRollup() {\n\ttry {\n\t\t// Use dynamic import to load ESM-only @lwc/rollup-plugin (peer dep, types not guaranteed)\n\t\tconst mod = await (import(\"@lwc/rollup-plugin\") as Promise<Record<string, unknown>>);\n\t\treturn (mod[\"default\"] ?? mod) as unknown as (options: Record<string, unknown>) => Plugin;\n\t} catch (error) {\n\t\tconst errMsg = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(\n\t\t\t\"@salesforce/vite-plugin-lwc-ui-bundle requires @lwc/rollup-plugin as a peer dependency. \" +\n\t\t\t\t\"Install it with: npm install -D @lwc/rollup-plugin\\n\" +\n\t\t\t\t`Debug: cwd=${process.cwd()}, error=${errMsg}`,\n\t\t);\n\t}\n}\n\nexport default function lwcVitePlugin(options: LwcVitePluginOptions = {}): Plugin[] {\n\tconst {\n\t\tmodules = {},\n\t\tproviders,\n\t\tstubs = {},\n\t\tlwcOptions = {},\n\t\tignorePatterns = [\n\t\t\t// Legacy @salesforce/sdk-* prefix — kept for external consumers still on the\n\t\t\t// pre-rename package names. The `@salesforce/platform-sdk-` prefix covers the\n\t\t\t// individual platform-sdk-* packages (still in place pending deprecation);\n\t\t\t// `@salesforce/platform-sdk` (no trailing dash) covers the consolidated package.\n\t\t\t\"@salesforce/sdk-\",\n\t\t\t\"@salesforce/platform-sdk-\",\n\t\t\t\"@salesforce/platform-sdk\",\n\t\t\t\"@salesforce/core\",\n\t\t\t\"@salesforce/vite-plugin-lwc-ui-bundle\",\n\t\t],\n\t\tpassthroughRules = [],\n\t} = options;\n\n\tconst resolvedItems = providers ?? defaultProviders();\n\tconst resolvedProviders = resolvedItems.filter(isProvider);\n\tconst rawPlugins = resolvedItems.filter((item): item is Plugin => !isProvider(item));\n\n\tconst { dirs = [], npm: npmPackages = [] } = modules;\n\n\tconst resolvedDirs: DirConfig[] = dirs.map((d) =>\n\t\ttypeof d === \"string\"\n\t\t\t? { path: path.resolve(d), namespace: \"\" }\n\t\t\t: { ...d, path: path.resolve(d.path) },\n\t);\n\n\tconst npmConfigs: NpmModuleConfig[] = npmPackages.map((pkg) =>\n\t\ttypeof pkg === \"string\" ? { npm: pkg } : pkg,\n\t);\n\n\tconst require = createRequire(import.meta.url);\n\tconst npmRoots = npmConfigs.map((cfg) => {\n\t\tconst pkgJson = require.resolve(`${cfg.npm}/package.json`);\n\t\treturn path.join(path.dirname(pkgJson), \"src\", \"lightning\");\n\t});\n\n\tconst discoveredModules = discoverModules(dirs);\n\n\tconst lwcModules = [...npmConfigs, ...discoveredModules];\n\n\tconst lightningOverrideDirs = resolvedDirs.map((d) => path.join(d.path, \"lightning\"));\n\n\tfunction isComponentAsset(id: string): boolean {\n\t\tconst clean = id.split(\"?\")[0] ?? id;\n\t\tfor (const dir of resolvedDirs) {\n\t\t\tif (clean.includes(dir.path)) return true;\n\t\t}\n\t\tfor (const cfg of npmConfigs) {\n\t\t\tif (clean.includes(cfg.npm)) return true;\n\t\t}\n\t\treturn clean.includes(\"@lwc/\") || clean.startsWith(\"\\0lwc-empty-css\");\n\t}\n\n\tconst stubAliases: Record<string, string> = {};\n\tfor (const [specifier, stubPath] of Object.entries(stubs)) {\n\t\tstubAliases[specifier] = path.resolve(stubPath);\n\t}\n\n\tconst interceptPrefixes = new Set<string>();\n\tfor (const p of resolvedProviders) {\n\t\tif (p.prefix && p.prefix.startsWith(\"@\")) {\n\t\t\tinterceptPrefixes.add(p.prefix.split(\"/\")[0] + \"/\");\n\t\t}\n\t}\n\n\tconst plugins: Plugin[] = [\n\t\t{\n\t\t\tname: \"vite-plugin-lwc-optimize-deps\",\n\t\t\tconfig() {\n\t\t\t\treturn {\n\t\t\t\t\toptimizeDeps: {\n\t\t\t\t\t\texclude: [\"lwc\"],\n\t\t\t\t\t\tesbuildOptions: {\n\t\t\t\t\t\t\tplugins: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: \"lwc-html-stub\",\n\t\t\t\t\t\t\t\t\tsetup(build: {\n\t\t\t\t\t\t\t\t\t\tonResolve: (\n\t\t\t\t\t\t\t\t\t\t\toptions: { filter: RegExp },\n\t\t\t\t\t\t\t\t\t\t\tcallback: (args: { path: string }) => {\n\t\t\t\t\t\t\t\t\t\t\t\tpath: string;\n\t\t\t\t\t\t\t\t\t\t\t\texternal: boolean;\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t) => void;\n\t\t\t\t\t\t\t\t\t}) {\n\t\t\t\t\t\t\t\t\t\t// esbuild cannot process LWC HTML templates (?lwc suffix).\n\t\t\t\t\t\t\t\t\t\t// Mark them as external so Vite's own plugin handles them.\n\t\t\t\t\t\t\t\t\t\tbuild.onResolve({ filter: /\\.html/ }, (args: { path: string }) => ({\n\t\t\t\t\t\t\t\t\t\t\tpath: args.path,\n\t\t\t\t\t\t\t\t\t\t\texternal: true,\n\t\t\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t\t// plugins returned by plugin-style builtins (e.g. lds())\n\t\t...rawPlugins,\n\t\tscopedProviders(resolvedProviders, {\n\t\t\tignorePatterns,\n\t\t\tinterceptPrefixes: [...interceptPrefixes],\n\t\t\tpassthroughRules,\n\t\t}),\n\n\t\t...npmRoots.map((npmRoot) =>\n\t\t\tlightningNpm({\n\t\t\t\tnpmRoot,\n\t\t\t\toverrideDirs: lightningOverrideDirs,\n\t\t\t}),\n\t\t),\n\n\t\tmissingCss(),\n\t\tlwcBridge(isComponentAsset),\n\t\tlwcWrapper(\n\t\t\tloadLwcRollup,\n\t\t\t{\n\t\t\t\trootDir: process.cwd(),\n\t\t\t\t...lwcOptions,\n\t\t\t\tmodules: lwcModules,\n\t\t\t\texclude: [\n\t\t\t\t\t\"**/index.html\",\n\t\t\t\t\t\"**/node_modules/vite/**\",\n\t\t\t\t\t\"**/node_modules/.vite/**\",\n\t\t\t\t\t...((lwcOptions.exclude as string[]) || []),\n\t\t\t\t],\n\t\t\t},\n\t\t\tisComponentAsset,\n\t\t),\n\t];\n\n\tif (Object.keys(stubAliases).length > 0) {\n\t\tplugins.push({\n\t\t\tname: \"vite-plugin-lwc-stubs\",\n\t\t\tenforce: \"pre\",\n\t\t\tconfig() {\n\t\t\t\treturn {\n\t\t\t\t\tresolve: {\n\t\t\t\t\t\talias: stubAliases,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\t}\n\n\treturn plugins;\n}\n"],"names":["builtinProviders.label","builtinProviders.i18n","builtinProviders.accessCheck","builtinProviders.client","builtinProviders.gate","builtinProviders.primitiveUtils","builtinProviders.lds","require"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/discovery.ts","../src/plugins/lightning-npm.ts","../src/plugins/lwc-bridge.ts","../src/plugins/lwc-wrapper.ts","../src/plugins/missing-css.ts","../src/plugins/scoped-providers.ts","../src/plugins/proxy.ts","../src/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 { existsSync, readdirSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { DirConfig, DiscoveredModule } from \"./types\";\n\nexport function discoverModules(dirs: (string | DirConfig)[] = []): DiscoveredModule[] {\n\tconst modules: DiscoveredModule[] = [];\n\n\tfor (const dir of dirs) {\n\t\tconst dirPath = typeof dir === \"string\" ? dir : dir.path;\n\t\tconst namespace = typeof dir === \"string\" ? undefined : dir.namespace;\n\t\tconst resolvedDir = path.resolve(dirPath);\n\n\t\tif (!existsSync(resolvedDir) || !statSync(resolvedDir).isDirectory()) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (namespace) {\n\t\t\t// Flat DX structure: <dir>/<componentName>/<componentName>.js\n\t\t\tfor (const name of readdirSync(resolvedDir)) {\n\t\t\t\tconst fullPath = path.join(resolvedDir, name);\n\t\t\t\tif (!statSync(fullPath).isDirectory()) continue;\n\n\t\t\t\tconst entryPath = path.join(fullPath, `${name}.js`);\n\t\t\t\tif (existsSync(entryPath)) {\n\t\t\t\t\tmodules.push({\n\t\t\t\t\t\tname: `${namespace}/${name}`,\n\t\t\t\t\t\tpath: path.resolve(entryPath),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Standard structure: <dir>/<namespace>/<componentName>/<componentName>.js\n\t\t\tfor (const ns of readdirSync(resolvedDir)) {\n\t\t\t\tconst nsDir = path.join(resolvedDir, ns);\n\t\t\t\tif (!statSync(nsDir).isDirectory()) continue;\n\n\t\t\t\tfor (const name of readdirSync(nsDir)) {\n\t\t\t\t\tconst fullPath = path.join(nsDir, name);\n\t\t\t\t\tif (!statSync(fullPath).isDirectory()) continue;\n\n\t\t\t\t\tconst entryPath = path.join(fullPath, `${name}.js`);\n\t\t\t\t\tif (existsSync(entryPath)) {\n\t\t\t\t\t\tmodules.push({\n\t\t\t\t\t\t\tname: `${ns}/${name}`,\n\t\t\t\t\t\t\tpath: path.resolve(entryPath),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn modules;\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\nimport type { LightningNpmOptions } from \"../types\";\n\nfunction resolveJsFromRoot(root: string, sub: string): string | null {\n\tconst segments = sub.split(\"/\");\n\tconst leaf = segments[segments.length - 1];\n\tconst nested = path.join(root, ...segments, `${leaf}.js`);\n\tif (existsSync(nested)) return nested;\n\tconst flat = path.join(root, `${sub}.js`);\n\tif (existsSync(flat)) return flat;\n\treturn null;\n}\n\nfunction resolveCssFromRoot(root: string, sub: string): string | null {\n\tconst segments = sub.split(\"/\");\n\tconst leaf = segments[segments.length - 1];\n\tconst nested = path.join(root, ...segments, `${leaf}.css`);\n\treturn existsSync(nested) ? nested : null;\n}\n\nexport function lightningNpm({ npmRoot, overrideDirs = [] }: LightningNpmOptions): Plugin {\n\treturn {\n\t\tname: \"vite-plugin-resolve-lightning-npm\",\n\t\tenforce: \"pre\",\n\n\t\tresolveId(importee) {\n\t\t\tif (!importee.startsWith(\"lightning/\")) return null;\n\n\t\t\tconst sub = importee.slice(\"lightning/\".length);\n\t\t\tconst segments = sub.split(\"/\");\n\t\t\tconst leaf = segments[segments.length - 1];\n\n\t\t\tfor (const dir of overrideDirs) {\n\t\t\t\tconst overridePath = path.join(dir, ...segments, `${leaf}.js`);\n\t\t\t\tif (existsSync(overridePath)) return null;\n\t\t\t}\n\n\t\t\tconst npmJs = resolveJsFromRoot(npmRoot, sub);\n\t\t\tif (npmJs) return npmJs;\n\n\t\t\tfor (const dir of overrideDirs) {\n\t\t\t\tconst cssFallback = path.join(dir, ...segments, `${leaf}.css`);\n\t\t\t\tif (existsSync(cssFallback)) return cssFallback;\n\t\t\t}\n\n\t\t\treturn resolveCssFromRoot(npmRoot, sub);\n\t\t},\n\t};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nexport function lwcBridge(isComponentAsset: (id: string) => boolean): Plugin {\n\treturn {\n\t\tname: \"vite-plugin-lwc-bridge\",\n\t\tenforce: \"pre\",\n\n\t\tconfigResolved(config: ResolvedConfig) {\n\t\t\tfor (const plugin of config.plugins) {\n\t\t\t\tif (plugin.name === \"vite:css\" || plugin.name === \"vite:css-post\") {\n\t\t\t\t\tconst p = plugin as unknown as Record<string, unknown>;\n\t\t\t\t\tconst origTransform = p[\"transform\"];\n\t\t\t\t\tif (!origTransform) continue;\n\n\t\t\t\t\tif (typeof origTransform === \"function\") {\n\t\t\t\t\t\t// Vite <7: transform is a plain function\n\t\t\t\t\t\tp[\"transform\"] = function (\n\t\t\t\t\t\t\tthis: unknown,\n\t\t\t\t\t\t\tcode: string,\n\t\t\t\t\t\t\tid: string,\n\t\t\t\t\t\t\t...rest: unknown[]\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (isComponentAsset(id)) return;\n\t\t\t\t\t\t\treturn (origTransform as (...a: unknown[]) => unknown).call(this, code, id, ...rest);\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof origTransform === \"object\" &&\n\t\t\t\t\t\ttypeof (origTransform as Record<string, unknown>)[\"handler\"] === \"function\"\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Vite 7+: transform is { handler, order? }\n\t\t\t\t\t\tconst origHandler = (origTransform as Record<string, unknown>)[\"handler\"] as (\n\t\t\t\t\t\t\t...a: unknown[]\n\t\t\t\t\t\t) => unknown;\n\t\t\t\t\t\tp[\"transform\"] = {\n\t\t\t\t\t\t\t...(origTransform as object),\n\t\t\t\t\t\t\thandler: function (this: unknown, code: string, id: string, ...rest: unknown[]) {\n\t\t\t\t\t\t\t\tif (isComponentAsset(id)) return;\n\t\t\t\t\t\t\t\treturn origHandler.call(this, code, id, ...rest);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tresolveId(id, importer) {\n\t\t\tif (id.startsWith(\"@lwc/resources/\")) {\n\t\t\t\treturn id;\n\t\t\t}\n\n\t\t\tconst cleanId = id.split(\"?\", 2)[0] ?? id;\n\n\t\t\tif (cleanId.endsWith(\".html\") && isComponentAsset(cleanId) && !id.includes(\"?lwc\")) {\n\t\t\t\treturn `${cleanId}?lwc`;\n\t\t\t}\n\n\t\t\tif (!importer) return null;\n\t\t\tif (!cleanId.endsWith(\".html\")) return null;\n\t\t\tif (!cleanId.startsWith(\"./\") && !cleanId.startsWith(\"../\")) return null;\n\t\t\tif (!isComponentAsset(importer)) return null;\n\n\t\t\tconst resolved = path.resolve(path.dirname(importer.split(\"?\")[0] ?? importer), cleanId);\n\n\t\t\tif (existsSync(resolved)) {\n\t\t\t\treturn resolved + \"?lwc\";\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (id.startsWith(\"@lwc/resources/\")) {\n\t\t\t\treturn \"export default undefined;\";\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type { Plugin } from \"vite\";\n\ntype AnyFn = (this: unknown, ...args: unknown[]) => unknown;\ntype LwcRollupFactory = (options: Record<string, unknown>) => Plugin;\ntype LazyLwcRollupLoader = () => Promise<LwcRollupFactory>;\n\nexport function lwcWrapper(\n\tlazyLoader: LazyLwcRollupLoader,\n\toptions: Record<string, unknown>,\n\tisComponentAsset?: (id: string) => boolean,\n): Plugin {\n\tlet pluginPromise: Promise<Plugin> | null = null;\n\n\tconst getPlugin = () => {\n\t\tif (!pluginPromise) {\n\t\t\tpluginPromise = lazyLoader().then((factory) => factory(options));\n\t\t}\n\t\treturn pluginPromise;\n\t};\n\n\treturn {\n\t\tname: \"vite-plugin-lwc-wrapper\",\n\t\tenforce: \"pre\" as const,\n\t\tasync resolveId(importee: string, importer?: string) {\n\t\t\tif (importer?.split(\"?\")[0]?.endsWith(\"index.html\") && !importer.includes(\"html-proxy\"))\n\t\t\t\treturn null;\n\t\t\tif (importee.startsWith(\"/@\") || importee.startsWith(\"\\0\")) return null;\n\t\t\tif (importer?.includes(\"/node_modules/vite/\")) return null;\n\t\t\tconst plugin = await getPlugin();\n\t\t\treturn typeof plugin.resolveId === \"function\"\n\t\t\t\t? (plugin.resolveId as AnyFn).call(this, importee, importer)\n\t\t\t\t: null;\n\t\t},\n\t\tasync load(id: string) {\n\t\t\tconst plugin = await getPlugin();\n\t\t\treturn typeof plugin.load === \"function\" ? (plugin.load as AnyFn).call(this, id) : null;\n\t\t},\n\t\tasync transform(code: string, id: string) {\n\t\t\t// Only pass files to the LWC compiler if they are LWC component assets.\n\t\t\t// Non-component files (SDK sources, node_modules, etc.) must be skipped.\n\t\t\tif (isComponentAsset && !isComponentAsset(id)) return null;\n\t\t\tconst plugin = await getPlugin();\n\t\t\treturn typeof plugin.transform === \"function\"\n\t\t\t\t? (plugin.transform as AnyFn).call(this, code, id)\n\t\t\t\t: null;\n\t\t},\n\t} as Plugin;\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\n\nconst LWC_EMPTY_CSS = \"\\0lwc-empty-css\";\n\nexport function missingCss(): Plugin {\n\treturn {\n\t\tname: \"vite-plugin-lwc-missing-css\",\n\t\tenforce: \"pre\",\n\n\t\tresolveId(id, importer) {\n\t\t\tif (!importer || !id.startsWith(\"./\") || !id.includes(\".css\")) return null;\n\t\t\tconst importerPath = importer.split(\"?\")[0] ?? importer;\n\t\t\tif (!importerPath.endsWith(\".html\")) return null;\n\n\t\t\tconst resolved = path.resolve(path.dirname(importerPath), id.split(\"?\")[0] ?? id);\n\t\t\tif (existsSync(resolved)) return null;\n\n\t\t\treturn `${LWC_EMPTY_CSS}?${id}`;\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (id.startsWith(LWC_EMPTY_CSS)) {\n\t\t\t\treturn \"export default undefined\";\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type { Plugin } from \"vite\";\nimport type { Provider, ScopedProvidersOptions } from \"../types\";\n\nconst VIRTUAL_PREFIX = \"\\0sf-provider:\";\n\nexport function scopedProviders(\n\tproviders: Provider[] = [],\n\toptions: ScopedProvidersOptions = {},\n): Plugin {\n\tconst { ignorePatterns = [], interceptPrefixes = [], passthroughRules = [] } = options;\n\n\tconst prefixSet = new Set<string>();\n\tfor (const p of providers) {\n\t\tif (p.prefix) prefixSet.add(p.prefix);\n\t}\n\n\tfunction shouldIntercept(id: string): boolean {\n\t\tfor (const prefix of prefixSet) {\n\t\t\tif (id === prefix || id.startsWith(prefix)) return true;\n\t\t}\n\t\tfor (const prefix of interceptPrefixes) {\n\t\t\tif (id.startsWith(prefix)) return true;\n\t\t}\n\t\tfor (const p of providers) {\n\t\t\tif (!p.prefix && typeof p.match === \"function\" && p.match(id)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tname: \"vite-plugin-scoped-module-providers\",\n\t\tenforce: \"pre\",\n\n\t\tresolveId(id, importer) {\n\t\t\t// Explicit provider prefix always wins over ignorePatterns —\n\t\t\t// if a provider is registered for a specifier, it always handles it.\n\t\t\tconst handledByProvider = [...prefixSet].some((p) => id === p || id.startsWith(p + \"/\"));\n\n\t\t\tif (!handledByProvider) {\n\t\t\t\tif (!shouldIntercept(id)) return null;\n\n\t\t\t\tfor (const pattern of ignorePatterns) {\n\t\t\t\t\tif (id.startsWith(pattern)) return null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const rule of passthroughRules) {\n\t\t\t\tif (\n\t\t\t\t\timporter &&\n\t\t\t\t\tid.startsWith(rule.specifierPrefix) &&\n\t\t\t\t\timporter.includes(rule.importerPattern)\n\t\t\t\t) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn VIRTUAL_PREFIX + id;\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (!id.startsWith(VIRTUAL_PREFIX)) return null;\n\n\t\t\tconst specifier = id.slice(VIRTUAL_PREFIX.length);\n\n\t\t\tfor (const provider of providers) {\n\t\t\t\tconst result = provider.resolve(specifier);\n\t\t\t\tif (result != null) return result;\n\t\t\t}\n\n\t\t\tconsole.warn(\n\t\t\t\t`[scoped-module-providers] Unhandled import: ${specifier} — returning undefined`,\n\t\t\t);\n\t\t\treturn `export default undefined;`;\n\t\t},\n\t};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport * as http from \"node:http\";\nimport * as https from \"node:https\";\nimport type { Plugin } from \"vite\";\n\nexport interface LwcProxyOptions {\n\t/** Salesforce org alias (defaults to the sf CLI default org) */\n\torgAlias?: string;\n\t/** Enable verbose request logging */\n\tdebug?: boolean;\n}\n\n/**\n * Vite plugin that proxies Salesforce API calls to a connected org.\n *\n * Uses the same authentication approach as @salesforce/vite-plugin-ui-bundle —\n * reads credentials from the sf CLI via @salesforce/ui-bundle/app.\n *\n * Intercepts requests to /services/ and /lwr/ and forwards them to Salesforce\n * with the org's access token. Handles token refresh on 401/403 responses.\n *\n * Usage in vite.config.js:\n * import { lwcProxy } from '@salesforce/vite-plugin-lwc-ui-bundle';\n * plugins: [lwcVitePlugin(...), lwcProxy()]\n *\n * Then initialise the SDK in your app's bootstrap:\n * import { createDataSDK } from '@salesforce/platform-sdk';\n * globalThis.__sfdc_sdk__ = await createDataSDK({ uiBundle: { basePath: '/' } });\n */\nexport function lwcProxy(options: LwcProxyOptions = {}): Plugin {\n\tlet instanceUrl: string | undefined;\n\tlet accessToken: string | undefined;\n\tconst orgAlias: string | undefined = options.orgAlias;\n\n\tasync function loadOrgInfo(): Promise<void> {\n\t\ttry {\n\t\t\t// Dynamically import to avoid bundling @salesforce/ui-bundle at build time\n\t\t\tconst { getOrgInfo } = await import(\"@salesforce/ui-bundle/app\");\n\t\t\tconst info = await getOrgInfo(orgAlias);\n\t\t\tif (info) {\n\t\t\t\tinstanceUrl = info.rawInstanceUrl ?? info.instanceUrl;\n\t\t\t\taccessToken = info.accessToken;\n\t\t\t\tif (options.debug) {\n\t\t\t\t\tconsole.log(`[lwc-proxy] Connected to ${instanceUrl}`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst msg = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(\n\t\t\t\t`[lwc-proxy] Failed to load org info — is a Salesforce org connected?\\n ${msg}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync function refreshToken(): Promise<void> {\n\t\ttry {\n\t\t\tconst { refreshOrgAuth } = await import(\"@salesforce/ui-bundle/app\");\n\t\t\tconst info = await refreshOrgAuth(orgAlias ?? \"\");\n\t\t\tif (info) {\n\t\t\t\tinstanceUrl = info.rawInstanceUrl ?? info.instanceUrl;\n\t\t\t\taccessToken = info.accessToken;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore refresh errors\n\t\t}\n\t}\n\n\treturn {\n\t\tname: \"vite-plugin-lwc-proxy\",\n\t\tenforce: \"pre\",\n\n\t\tasync configResolved() {\n\t\t\tawait loadOrgInfo();\n\t\t},\n\n\t\tconfigureServer(server) {\n\t\t\tserver.middlewares.use(async (req, res, next) => {\n\t\t\t\tconst url = req.url ?? \"\";\n\n\t\t\t\t// Only proxy Salesforce API paths\n\t\t\t\tif (!url.startsWith(\"/services/\") && !url.startsWith(\"/lwr/\")) {\n\t\t\t\t\treturn next();\n\t\t\t\t}\n\n\t\t\t\tif (!instanceUrl || !accessToken) {\n\t\t\t\t\tres.writeHead(503, { \"Content-Type\": \"application/json\" });\n\t\t\t\t\tres.end(\n\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\terror: \"SERVICE_UNAVAILABLE\",\n\t\t\t\t\t\t\tmessage: \"Salesforce org not connected. Run: sf org display\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst forward = async (token: string): Promise<void> => {\n\t\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\t\tconst targetUrl = new URL(url, instanceUrl);\n\t\t\t\t\t\tconst isHttps = targetUrl.protocol === \"https:\";\n\t\t\t\t\t\tconst transport = isHttps ? https : http;\n\n\t\t\t\t\t\tif (options.debug) {\n\t\t\t\t\t\t\tconsole.log(`[lwc-proxy] ${req.method} ${url}`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Strip hop-by-hop headers\n\t\t\t\t\t\tconst headers: Record<string, string | string[]> = {};\n\t\t\t\t\t\tfor (const [key, value] of Object.entries(req.headers)) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t![\n\t\t\t\t\t\t\t\t\t\"host\",\n\t\t\t\t\t\t\t\t\t\"connection\",\n\t\t\t\t\t\t\t\t\t\"keep-alive\",\n\t\t\t\t\t\t\t\t\t\"proxy-authenticate\",\n\t\t\t\t\t\t\t\t\t\"proxy-authorization\",\n\t\t\t\t\t\t\t\t\t\"te\",\n\t\t\t\t\t\t\t\t\t\"trailers\",\n\t\t\t\t\t\t\t\t\t\"transfer-encoding\",\n\t\t\t\t\t\t\t\t\t\"upgrade\",\n\t\t\t\t\t\t\t\t].includes(key.toLowerCase()) &&\n\t\t\t\t\t\t\t\tvalue !== undefined\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\theaders[key] = value as string | string[];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\theaders[\"host\"] = targetUrl.host;\n\t\t\t\t\t\theaders[\"authorization\"] = `Bearer ${token}`;\n\t\t\t\t\t\theaders[\"cookie\"] = `sid=${token}`;\n\n\t\t\t\t\t\tconst proxyReq = transport.request(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmethod: req.method,\n\t\t\t\t\t\t\t\thostname: targetUrl.hostname,\n\t\t\t\t\t\t\t\tport: targetUrl.port || (isHttps ? 443 : 80),\n\t\t\t\t\t\t\t\tpath: targetUrl.pathname + targetUrl.search,\n\t\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(proxyRes) => {\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\tres.writeHead(proxyRes.statusCode ?? 200, proxyRes.headers);\n\t\t\t\t\t\t\t\tproxyRes.pipe(res);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treq.pipe(proxyReq);\n\t\t\t\t\t\tproxyReq.on(\"error\", reject);\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\ttry {\n\t\t\t\t\tawait forward(accessToken!);\n\n\t\t\t\t\t// On 401/403, refresh token and retry once\n\t\t\t\t\t// Note: we can't easily check status here since we piped to res,\n\t\t\t\t\t// so we rely on the transform hook below for retries in future iterations\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (options.debug) {\n\t\t\t\t\t\tconsole.error(\"[lwc-proxy] Request failed:\", error);\n\t\t\t\t\t}\n\t\t\t\t\t// Try refreshing token and retry\n\t\t\t\t\tawait refreshToken();\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait forward(accessToken!);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tnext(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\nimport { discoverModules } from \"./discovery\";\nimport { lightningNpm } from \"./plugins/lightning-npm\";\nimport { lwcBridge } from \"./plugins/lwc-bridge\";\nimport { lwcWrapper } from \"./plugins/lwc-wrapper\";\nimport { missingCss } from \"./plugins/missing-css\";\nimport { scopedProviders } from \"./plugins/scoped-providers\";\nimport * as builtinProviders from \"./providers/index\";\nimport type {\n\tDirConfig,\n\tLwcVitePluginOptions,\n\tNpmModuleConfig,\n\tPassthroughRule,\n\tProvider,\n} from \"./types\";\n\nexport type {\n\tProvider,\n\tLwcVitePluginOptions,\n\tPassthroughRule,\n\tDiscoveredModule,\n\tDirConfig,\n} from \"./types\";\nexport { builtinProviders as builtins };\nexport { discoverModules } from \"./discovery\";\nexport { lwcProxy } from \"./plugins/proxy\";\nexport type { LwcProxyOptions } from \"./plugins/proxy\";\n\nfunction defaultProviders(): (Provider | Plugin)[] {\n\treturn [\n\t\tbuiltinProviders.label(),\n\t\tbuiltinProviders.i18n(),\n\t\tbuiltinProviders.accessCheck(),\n\t\tbuiltinProviders.client(),\n\t\tbuiltinProviders.gate(),\n\t\tbuiltinProviders.primitiveUtils(),\n\t\tbuiltinProviders.lds(),\n\t];\n}\n\n/** Distinguishes a scoped-providers `Provider` from a raw Vite `Plugin`. */\nfunction isProvider(item: Provider | Plugin): item is Provider {\n\treturn typeof (item as Provider).resolve === \"function\";\n}\n\nasync function loadLwcRollup() {\n\ttry {\n\t\t// Use dynamic import to load ESM-only @lwc/rollup-plugin (peer dep, types not guaranteed)\n\t\tconst mod = await (import(\"@lwc/rollup-plugin\") as Promise<Record<string, unknown>>);\n\t\treturn (mod[\"default\"] ?? mod) as unknown as (options: Record<string, unknown>) => Plugin;\n\t} catch (error) {\n\t\tconst errMsg = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(\n\t\t\t\"@salesforce/vite-plugin-lwc-ui-bundle requires @lwc/rollup-plugin as a peer dependency. \" +\n\t\t\t\t\"Install it with: npm install -D @lwc/rollup-plugin\\n\" +\n\t\t\t\t`Debug: cwd=${process.cwd()}, error=${errMsg}`,\n\t\t);\n\t}\n}\n\nexport default function lwcVitePlugin(options: LwcVitePluginOptions = {}): Plugin[] {\n\tconst {\n\t\tmodules = {},\n\t\tproviders,\n\t\tstubs = {},\n\t\tlwcOptions = {},\n\t\tignorePatterns = [\n\t\t\t// Legacy @salesforce/sdk-* prefix — kept for external consumers still on the\n\t\t\t// pre-rename package names. The `@salesforce/platform-sdk-` prefix covers the\n\t\t\t// individual platform-sdk-* packages (still in place pending deprecation);\n\t\t\t// `@salesforce/platform-sdk` (no trailing dash) covers the consolidated package.\n\t\t\t\"@salesforce/sdk-\",\n\t\t\t\"@salesforce/platform-sdk-\",\n\t\t\t\"@salesforce/platform-sdk\",\n\t\t\t\"@salesforce/core\",\n\t\t\t\"@salesforce/vite-plugin-lwc-ui-bundle\",\n\t\t],\n\t\tpassthroughRules = [],\n\t} = options;\n\n\tconst resolvedItems = providers ?? defaultProviders();\n\tconst resolvedProviders = resolvedItems.filter(isProvider);\n\tconst rawPlugins = resolvedItems.filter((item): item is Plugin => !isProvider(item));\n\n\tconst { dirs = [], npm: npmPackages = [] } = modules;\n\n\tconst resolvedDirs: DirConfig[] = dirs.map((d) =>\n\t\ttypeof d === \"string\"\n\t\t\t? { path: path.resolve(d), namespace: \"\" }\n\t\t\t: { ...d, path: path.resolve(d.path) },\n\t);\n\n\tconst npmConfigs: NpmModuleConfig[] = npmPackages.map((pkg) =>\n\t\ttypeof pkg === \"string\" ? { npm: pkg } : pkg,\n\t);\n\n\tconst require = createRequire(import.meta.url);\n\tconst npmRoots = npmConfigs.map((cfg) => {\n\t\tconst pkgJson = require.resolve(`${cfg.npm}/package.json`);\n\t\treturn path.join(path.dirname(pkgJson), \"src\", \"lightning\");\n\t});\n\n\tconst discoveredModules = discoverModules(dirs);\n\n\tconst lwcModules = [...npmConfigs, ...discoveredModules];\n\n\tconst lightningOverrideDirs = resolvedDirs.map((d) => path.join(d.path, \"lightning\"));\n\n\tfunction isComponentAsset(id: string): boolean {\n\t\tconst clean = id.split(\"?\")[0] ?? id;\n\t\tfor (const dir of resolvedDirs) {\n\t\t\tif (clean.includes(dir.path)) return true;\n\t\t}\n\t\tfor (const cfg of npmConfigs) {\n\t\t\tif (clean.includes(cfg.npm)) return true;\n\t\t}\n\t\treturn clean.includes(\"@lwc/\") || clean.startsWith(\"\\0lwc-empty-css\");\n\t}\n\n\tconst stubAliases: Record<string, string> = {};\n\tfor (const [specifier, stubPath] of Object.entries(stubs)) {\n\t\tstubAliases[specifier] = path.resolve(stubPath);\n\t}\n\n\tconst interceptPrefixes = new Set<string>();\n\tfor (const p of resolvedProviders) {\n\t\tif (p.prefix && p.prefix.startsWith(\"@\")) {\n\t\t\tinterceptPrefixes.add(p.prefix.split(\"/\")[0] + \"/\");\n\t\t}\n\t}\n\n\t// Plugin-style providers (e.g. lds()) can contribute passthroughRules so\n\t// imports made from inside their virtual modules reach the real npm\n\t// package instead of being claimed by scopedProviders' broad\n\t// `@salesforce/` interceptPrefix.\n\tconst pluginPassthroughRules = rawPlugins.flatMap(\n\t\t(p) => (p as { passthroughRules?: PassthroughRule[] }).passthroughRules ?? [],\n\t);\n\n\tconst plugins: Plugin[] = [\n\t\t{\n\t\t\tname: \"vite-plugin-lwc-optimize-deps\",\n\t\t\tconfig() {\n\t\t\t\treturn {\n\t\t\t\t\toptimizeDeps: {\n\t\t\t\t\t\texclude: [\"lwc\"],\n\t\t\t\t\t\tesbuildOptions: {\n\t\t\t\t\t\t\tplugins: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: \"lwc-html-stub\",\n\t\t\t\t\t\t\t\t\tsetup(build: {\n\t\t\t\t\t\t\t\t\t\tonResolve: (\n\t\t\t\t\t\t\t\t\t\t\toptions: { filter: RegExp },\n\t\t\t\t\t\t\t\t\t\t\tcallback: (args: { path: string }) => {\n\t\t\t\t\t\t\t\t\t\t\t\tpath: string;\n\t\t\t\t\t\t\t\t\t\t\t\texternal: boolean;\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t) => void;\n\t\t\t\t\t\t\t\t\t}) {\n\t\t\t\t\t\t\t\t\t\t// esbuild cannot process LWC HTML templates (?lwc suffix).\n\t\t\t\t\t\t\t\t\t\t// Mark them as external so Vite's own plugin handles them.\n\t\t\t\t\t\t\t\t\t\tbuild.onResolve({ filter: /\\.html/ }, (args: { path: string }) => ({\n\t\t\t\t\t\t\t\t\t\t\tpath: args.path,\n\t\t\t\t\t\t\t\t\t\t\texternal: true,\n\t\t\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t\t// plugins returned by plugin-style builtins (e.g. lds())\n\t\t...rawPlugins,\n\t\tscopedProviders(resolvedProviders, {\n\t\t\tignorePatterns,\n\t\t\tinterceptPrefixes: [...interceptPrefixes],\n\t\t\tpassthroughRules: [...passthroughRules, ...pluginPassthroughRules],\n\t\t}),\n\n\t\t...npmRoots.map((npmRoot) =>\n\t\t\tlightningNpm({\n\t\t\t\tnpmRoot,\n\t\t\t\toverrideDirs: lightningOverrideDirs,\n\t\t\t}),\n\t\t),\n\n\t\tmissingCss(),\n\t\tlwcBridge(isComponentAsset),\n\t\tlwcWrapper(\n\t\t\tloadLwcRollup,\n\t\t\t{\n\t\t\t\trootDir: process.cwd(),\n\t\t\t\t...lwcOptions,\n\t\t\t\tmodules: lwcModules,\n\t\t\t\texclude: [\n\t\t\t\t\t\"**/index.html\",\n\t\t\t\t\t\"**/node_modules/vite/**\",\n\t\t\t\t\t\"**/node_modules/.vite/**\",\n\t\t\t\t\t...((lwcOptions.exclude as string[]) || []),\n\t\t\t\t],\n\t\t\t},\n\t\t\tisComponentAsset,\n\t\t),\n\t];\n\n\tif (Object.keys(stubAliases).length > 0) {\n\t\tplugins.push({\n\t\t\tname: \"vite-plugin-lwc-stubs\",\n\t\t\tenforce: \"pre\",\n\t\t\tconfig() {\n\t\t\t\treturn {\n\t\t\t\t\tresolve: {\n\t\t\t\t\t\talias: stubAliases,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\t}\n\n\treturn plugins;\n}\n"],"names":["builtinProviders.label","builtinProviders.i18n","builtinProviders.accessCheck","builtinProviders.client","builtinProviders.gate","builtinProviders.primitiveUtils","builtinProviders.lds","require"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { JSONSchema } from '@conduit-client/jsonschema-validate';
2
2
  import { Plugin } from 'vite';
3
3
  import { ReadInvokerShape } from './types';
4
+ import { PassthroughRule } from '../../types';
4
5
  /**
5
6
  * MCP dispatch descriptor. Nested under `mcp` on every adapter config so
6
7
  * additional MCP-specific fields (auth, transport, retry policy) can join
@@ -98,7 +99,47 @@ export interface LdsGraphqlImperativeReadAdapterConfig extends LdsAdapterConfigB
98
99
  type: "graphql-imperative-read";
99
100
  invokerShape: LdsGraphqlImperativeReadInvokerShape;
100
101
  }
101
- export type LdsAdapterConfig = LdsWireAdapterConfig | LdsImperativeMutationAdapterConfig | LdsImperativeReadAdapterConfig | LdsGraphqlWireAdapterConfig | LdsGraphqlMutationAdapterConfig | LdsGraphqlImperativeReadAdapterConfig;
102
+ /**
103
+ * State-manager adapter config. The lds plugin's load hook emits a
104
+ * factory-composition body for each state-manager registry entry — see
105
+ * `buildStateManagerCompositionBody`. Two emit shapes:
106
+ *
107
+ * - **UIAPI** (`lightning/stateManagerRecord`, `…ObjectInfo`) — synthesizes
108
+ * a legacy-shape imperative-read adapter inline via `createReadAdapter`
109
+ * and feeds it into the upstream per-state-manager factory
110
+ * (`createSmRecord` / `createSmObjectInfo`) re-exported from
111
+ * `@salesforce/state-managers-uiapi/factory`.
112
+ *
113
+ * - **GraphQL** (`lightning/stateManagerGraphQL`) — calls the upstream
114
+ * per-state-manager factory `createSmGraphQL` re-exported from
115
+ * `@salesforce/lds-adapters-onestore-graphql/factory` with an MCP-backed
116
+ * `getCommand` synthesized via `createGraphqlStateManagerCommand` (a
117
+ * `runtime.ts` helper). The required / optional config keys
118
+ * (`['query']`, `['variables', 'operationName']`) live in the upstream
119
+ * factory — a fixed contract of `lightning/stateManagerGraphQL` — so the
120
+ * load-hook emit doesn't pass them. Mirrors the UIAPI shape (one
121
+ * factory call, adapter argument only).
122
+ *
123
+ * Per-state-manager metadata (definedBy, requiredKeys, optionalKeys,
124
+ * predicate) lives in the upstream factory — not here. See spec §8.4 / §10.4.
125
+ *
126
+ * `configJsonSchema` is optional: UIAPI state managers supply it (the
127
+ * load hook embeds it in the synthesized imperative-read adapter), but
128
+ * the graphql state-manager path doesn't read it (off-core graphql
129
+ * forgoes the on-core `assertIsValid` / `resolveAndValidateGraphQLConfig`
130
+ * validation layer; spec §4 Non-goal 9 — malformed configs surface as
131
+ * MCP tool errors at execute time instead).
132
+ */
133
+ export interface LdsStateManagerAdapterConfig extends LdsAdapterConfigBase {
134
+ type: "state-manager";
135
+ /** Upstream factory specifier — e.g. '@salesforce/state-managers-uiapi/factory'. */
136
+ factoryModule: string;
137
+ /** Named export within `factoryModule` — e.g. 'createSmRecord' (UIAPI), 'createSmGraphQL' (graphql). */
138
+ factoryName: string;
139
+ /** JSON Schema for the config object — required for UIAPI state managers, omitted for graphql. */
140
+ configJsonSchema?: JSONSchema;
141
+ }
142
+ export type LdsAdapterConfig = LdsWireAdapterConfig | LdsImperativeMutationAdapterConfig | LdsImperativeReadAdapterConfig | LdsGraphqlWireAdapterConfig | LdsGraphqlMutationAdapterConfig | LdsGraphqlImperativeReadAdapterConfig | LdsStateManagerAdapterConfig;
102
143
  export type LdsAdapterRegistry = Record<string, Record<string, LdsAdapterConfig>>;
103
144
  /**
104
145
  * LDS provider — rewrites registered `lightning/*` imports (e.g.
@@ -123,5 +164,7 @@ export type LdsAdapterRegistry = Record<string, Record<string, LdsAdapterConfig>
123
164
  * Only specifiers present in the `adapters` registry are intercepted; imports from
124
165
  * unregistered specifiers pass through unchanged.
125
166
  */
126
- export declare function lds(overrides?: LdsAdapterRegistry): Plugin;
167
+ export declare function lds(overrides?: LdsAdapterRegistry): Plugin & {
168
+ passthroughRules: PassthroughRule[];
169
+ };
127
170
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/lds/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAGtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAuChD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC,GAAG,CAAC,EAAE,qBAAqB,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,+BAAgC,SAAQ,oBAAoB;IAC5E,gBAAgB,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAqB,SAAQ,+BAA+B;IAC5E,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kCAAmC,SAAQ,+BAA+B;IAC1F,IAAI,EAAE,qBAAqB,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,6BAA6B,GAAG,gBAAgB,CAAC;AAE7D,MAAM,WAAW,8BAA+B,SAAQ,+BAA+B;IACtF,IAAI,EAAE,iBAAiB,CAAC;IACxB,YAAY,EAAE,6BAA6B,CAAC;CAC5C;AAED;;;;GAIG;AACH,MAAM,WAAW,2BAA4B,SAAQ,oBAAoB;IACxE,IAAI,EAAE,cAAc,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,+BAAgC,SAAQ,oBAAoB;IAC5E,IAAI,EAAE,kBAAkB,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,oCAAoC,GAAG,OAAO,GAAG,mBAAmB,GAAG,QAAQ,CAAC;AAE5F;;;;;GAKG;AACH,MAAM,WAAW,qCAAsC,SAAQ,oBAAoB;IAClF,IAAI,EAAE,yBAAyB,CAAC;IAChC,YAAY,EAAE,oCAAoC,CAAC;CACnD;AAED,MAAM,MAAM,gBAAgB,GACzB,oBAAoB,GACpB,kCAAkC,GAClC,8BAA8B,GAC9B,2BAA2B,GAC3B,+BAA+B,GAC/B,qCAAqC,CAAC;AAEzC,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;AA4KlF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,GAAG,CAAC,SAAS,GAAE,kBAAuB,GAAG,MAAM,CA+G9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/lds/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAGtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAuCnD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC,GAAG,CAAC,EAAE,qBAAqB,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,+BAAgC,SAAQ,oBAAoB;IAC5E,gBAAgB,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAqB,SAAQ,+BAA+B;IAC5E,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kCAAmC,SAAQ,+BAA+B;IAC1F,IAAI,EAAE,qBAAqB,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,6BAA6B,GAAG,gBAAgB,CAAC;AAE7D,MAAM,WAAW,8BAA+B,SAAQ,+BAA+B;IACtF,IAAI,EAAE,iBAAiB,CAAC;IACxB,YAAY,EAAE,6BAA6B,CAAC;CAC5C;AAED;;;;GAIG;AACH,MAAM,WAAW,2BAA4B,SAAQ,oBAAoB;IACxE,IAAI,EAAE,cAAc,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,+BAAgC,SAAQ,oBAAoB;IAC5E,IAAI,EAAE,kBAAkB,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,oCAAoC,GAAG,OAAO,GAAG,mBAAmB,GAAG,QAAQ,CAAC;AAE5F;;;;;GAKG;AACH,MAAM,WAAW,qCAAsC,SAAQ,oBAAoB;IAClF,IAAI,EAAE,yBAAyB,CAAC;IAChC,YAAY,EAAE,oCAAoC,CAAC;CACnD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACzE,IAAI,EAAE,eAAe,CAAC;IACtB,oFAAoF;IACpF,aAAa,EAAE,MAAM,CAAC;IACtB,wGAAwG;IACxG,WAAW,EAAE,MAAM,CAAC;IACpB,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,UAAU,CAAC;CAC9B;AAED,MAAM,MAAM,gBAAgB,GACzB,oBAAoB,GACpB,kCAAkC,GAClC,8BAA8B,GAC9B,2BAA2B,GAC3B,+BAA+B,GAC/B,qCAAqC,GACrC,4BAA4B,CAAC;AAEhC,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAuVlF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,GAAG,CAClB,SAAS,GAAE,kBAAuB,GAChC,MAAM,GAAG;IAAE,gBAAgB,EAAE,eAAe,EAAE,CAAA;CAAE,CAiKlD"}
@@ -11,47 +11,59 @@ const adapterBaseSource = stripTopLevelExports(
11
11
  function stripTopLevelExports(source) {
12
12
  return source.replace(/^export\s+(?=(?:async\s+)?function\s)/gm, "").replace(/^export\s*\{[^}]*};?\s*$/gm, "");
13
13
  }
14
+ const RECORD_TOOL = "getRecordMcpTool";
15
+ const RECORD_SCHEMA = {
16
+ type: "object",
17
+ properties: {
18
+ recordId: { type: "string" },
19
+ layoutTypes: {
20
+ anyOf: [{ type: "array", items: { type: "string" } }, { type: "null" }]
21
+ },
22
+ fields: {
23
+ anyOf: [{ type: "array", items: { type: "string" } }, { type: "null" }]
24
+ }
25
+ },
26
+ required: ["recordId"],
27
+ additionalProperties: false,
28
+ anyOf: [
29
+ {
30
+ type: "object",
31
+ properties: {
32
+ fields: { type: "array", items: { type: "string" }, minItems: 1 }
33
+ },
34
+ required: ["fields"],
35
+ additionalProperties: true
36
+ },
37
+ {
38
+ type: "object",
39
+ properties: {
40
+ layoutTypes: {
41
+ type: "array",
42
+ items: { type: "string" },
43
+ minItems: 1
44
+ }
45
+ },
46
+ required: ["layoutTypes"],
47
+ additionalProperties: true
48
+ }
49
+ ]
50
+ };
51
+ const OBJECT_INFO_TOOL = "getObjectInfoMcpTool";
52
+ const OBJECT_INFO_SCHEMA = {
53
+ type: "object",
54
+ properties: {
55
+ objectApiName: { type: "string" }
56
+ },
57
+ required: ["objectApiName"],
58
+ additionalProperties: false
59
+ };
60
+ const GRAPHQL_TOOL = "graphqlQuery";
14
61
  const DEFAULT_ADAPTERS = {
15
62
  "lightning/uiRecordApi": {
16
63
  getRecord: {
17
64
  type: "wire",
18
- mcp: { toolName: "getRecordMcpTool" },
19
- configJsonSchema: {
20
- type: "object",
21
- properties: {
22
- recordId: { type: "string" },
23
- layoutTypes: {
24
- anyOf: [{ type: "array", items: { type: "string" } }, { type: "null" }]
25
- },
26
- fields: {
27
- anyOf: [{ type: "array", items: { type: "string" } }, { type: "null" }]
28
- }
29
- },
30
- required: ["recordId"],
31
- additionalProperties: false,
32
- anyOf: [
33
- {
34
- type: "object",
35
- properties: {
36
- fields: { type: "array", items: { type: "string" }, minItems: 1 }
37
- },
38
- required: ["fields"],
39
- additionalProperties: true
40
- },
41
- {
42
- type: "object",
43
- properties: {
44
- layoutTypes: {
45
- type: "array",
46
- items: { type: "string" },
47
- minItems: 1
48
- }
49
- },
50
- required: ["layoutTypes"],
51
- additionalProperties: true
52
- }
53
- ]
54
- }
65
+ mcp: { toolName: RECORD_TOOL },
66
+ configJsonSchema: RECORD_SCHEMA
55
67
  },
56
68
  createRecord: {
57
69
  type: "imperative-mutation",
@@ -97,15 +109,8 @@ const DEFAULT_ADAPTERS = {
97
109
  getObjectInfo_imperative: {
98
110
  type: "imperative-read",
99
111
  invokerShape: "legacy",
100
- mcp: { toolName: "getObjectInfoMcpTool" },
101
- configJsonSchema: {
102
- type: "object",
103
- properties: {
104
- objectApiName: { type: "string" }
105
- },
106
- required: ["objectApiName"],
107
- additionalProperties: false
108
- }
112
+ mcp: { toolName: OBJECT_INFO_TOOL },
113
+ configJsonSchema: OBJECT_INFO_SCHEMA
109
114
  }
110
115
  },
111
116
  // `lightning/graphql` — on-platform exports `gql`, the `graphql` wire
@@ -113,8 +118,68 @@ const DEFAULT_ADAPTERS = {
113
118
  // are registry entries; `gql` rides along automatically for any specifier
114
119
  // that has at least one graphql-typed entry (emitted by the load hook).
115
120
  "lightning/graphql": {
116
- graphql: { type: "graphql-wire", mcp: { toolName: "graphqlQuery" } },
117
- executeMutation: { type: "graphql-mutation", mcp: { toolName: "graphqlQuery" } }
121
+ graphql: { type: "graphql-wire", mcp: { toolName: GRAPHQL_TOOL } },
122
+ executeMutation: { type: "graphql-mutation", mcp: { toolName: GRAPHQL_TOOL } }
123
+ },
124
+ // `lightning/stateManagerGraphQL` — externalized graphql state manager.
125
+ // The load hook imports `createSmGraphQL` from the upstream
126
+ // `@salesforce/lds-adapters-onestore-graphql/factory` barrel — a thin
127
+ // per-state-manager wrapper around `createStateManager` that bakes in
128
+ // the required (`['query']`) / optional (`['variables', 'operationName']`)
129
+ // config keys, mirroring `createSmRecord` / `createSmObjectInfo`. The
130
+ // same factory wraps the call site on-core via `bindings/bindings.ts`,
131
+ // so off-core composition fidelity is preserved without on-core service
132
+ // plumbing leaking into this side.
133
+ //
134
+ // Per §10.3 the registry only ever has `default` as its key — the
135
+ // `createSmGraphQL` return value is itself the `default` export of
136
+ // the virtual module.
137
+ //
138
+ // `configJsonSchema` is omitted: off-core graphql forgoes the on-core
139
+ // `assertIsValid` / `resolveAndValidateGraphQLConfig` validation layer
140
+ // (§4 Non-goal 9), and the load-hook graphql path doesn't read the
141
+ // field anyway — malformed configs surface as MCP tool errors at
142
+ // execute time instead.
143
+ "lightning/stateManagerGraphQL": {
144
+ default: {
145
+ type: "state-manager",
146
+ factoryModule: "@salesforce/lds-adapters-onestore-graphql/factory",
147
+ factoryName: "createSmGraphQL",
148
+ mcp: { toolName: GRAPHQL_TOOL }
149
+ }
150
+ },
151
+ // State-manager specifier for ObjectInfo (spec §8.3 / §10.3). The load hook
152
+ // synthesizes a legacy-shape imperative-read adapter inline from
153
+ // (mcp.toolName, configJsonSchema) and feeds it to the upstream
154
+ // `createSmObjectInfo` factory. Reuses the shared `OBJECT_INFO_TOOL` /
155
+ // `OBJECT_INFO_SCHEMA` so this entry stays in lock-step with the
156
+ // `lightning/uiObjectInfoApi.getObjectInfo_imperative` entry above —
157
+ // both back the same UIAPI ObjectInfo MCP tool.
158
+ "lightning/stateManagerObjectInfo": {
159
+ default: {
160
+ type: "state-manager",
161
+ factoryModule: "@salesforce/state-managers-uiapi/factory",
162
+ factoryName: "createSmObjectInfo",
163
+ mcp: { toolName: OBJECT_INFO_TOOL },
164
+ configJsonSchema: OBJECT_INFO_SCHEMA
165
+ }
166
+ },
167
+ // `lightning/stateManagerRecord` — UIAPI Record state-manager. Per spec
168
+ // §10.3 the registry only ever has a single `default` key; the load hook
169
+ // synthesizes a legacy-shape imperative-read adapter from
170
+ // (mcp.toolName, configJsonSchema) and feeds it into the upstream
171
+ // `createSmRecord` factory to produce the externalized state manager.
172
+ // Reuses the shared `RECORD_TOOL` / `RECORD_SCHEMA` so the wire and
173
+ // state-manager paths stay anchored to a single MCP-tool / config
174
+ // contract.
175
+ "lightning/stateManagerRecord": {
176
+ default: {
177
+ type: "state-manager",
178
+ factoryModule: "@salesforce/state-managers-uiapi/factory",
179
+ factoryName: "createSmRecord",
180
+ mcp: { toolName: RECORD_TOOL },
181
+ configJsonSchema: RECORD_SCHEMA
182
+ }
118
183
  }
119
184
  };
120
185
  function isGraphqlSpecifier(moduleAdapters) {
@@ -122,6 +187,34 @@ function isGraphqlSpecifier(moduleAdapters) {
122
187
  (entry) => entry.type === "graphql-wire" || entry.type === "graphql-mutation" || entry.type === "graphql-imperative-read"
123
188
  );
124
189
  }
190
+ function isStateManagerSpecifier(moduleAdapters) {
191
+ return Object.values(moduleAdapters).some((entry) => entry.type === "state-manager");
192
+ }
193
+ function isGraphqlStateManagerSpecifier(specifier) {
194
+ return specifier === "lightning/stateManagerGraphQL";
195
+ }
196
+ function buildStateManagerCompositionBody(name, cfg, specifier) {
197
+ if (isGraphqlStateManagerSpecifier(specifier)) {
198
+ const graphqlCfg = { mcp: { toolName: cfg.mcp?.toolName } };
199
+ return [
200
+ `import { ${cfg.factoryName} } from ${JSON.stringify(cfg.factoryModule)};`,
201
+ `const __getCommand_${name} = createGraphqlStateManagerCommand(${JSON.stringify(name)}, ${JSON.stringify(graphqlCfg)});`,
202
+ `export default ${cfg.factoryName}(__getCommand_${name});`
203
+ ].join("\n");
204
+ }
205
+ const synthesizedCfg = {
206
+ type: "imperative-read",
207
+ invokerShape: "legacy",
208
+ mcp: { toolName: cfg.mcp?.toolName },
209
+ configJsonSchema: cfg.configJsonSchema
210
+ };
211
+ return [
212
+ `import { ${cfg.factoryName} } from ${JSON.stringify(cfg.factoryModule)};`,
213
+ `const __cfg_${name} = ${JSON.stringify(synthesizedCfg)};`,
214
+ `const __imperativeAdapter_${name} = createReadAdapter(${JSON.stringify(name)}, __cfg_${name});`,
215
+ `export default ${cfg.factoryName}(__imperativeAdapter_${name});`
216
+ ].join("\n");
217
+ }
125
218
  function factoryFor(type) {
126
219
  switch (type) {
127
220
  case "wire":
@@ -136,6 +229,8 @@ function factoryFor(type) {
136
229
  return "createGraphQLMutationAdapter";
137
230
  case "graphql-imperative-read":
138
231
  return "createGraphQLImperativeReadAdapter";
232
+ case "state-manager":
233
+ return "createStateManagerComposition";
139
234
  }
140
235
  }
141
236
  function parseImportSpecifiers(bracesContent) {
@@ -157,9 +252,26 @@ function lds(overrides = {}) {
157
252
  const graphqlSpecifiers = new Set(
158
253
  Object.entries(adapters).filter(([, moduleAdapters]) => isGraphqlSpecifier(moduleAdapters)).map(([specifier]) => specifier)
159
254
  );
160
- const transformSpecifiers = Object.keys(adapters).filter((s) => !graphqlSpecifiers.has(s));
255
+ const stateManagerSpecifiers = new Set(
256
+ Object.entries(adapters).filter(([, moduleAdapters]) => isStateManagerSpecifier(moduleAdapters)).map(([specifier]) => specifier)
257
+ );
258
+ const transformSpecifiers = Object.keys(adapters).filter(
259
+ (s) => !graphqlSpecifiers.has(s) && !stateManagerSpecifiers.has(s)
260
+ );
161
261
  const specifierSnippets = transformSpecifiers.flatMap((s) => [`'${s}'`, `"${s}"`]);
162
- return {
262
+ const factoryModuleSpecifiers = /* @__PURE__ */ new Set();
263
+ for (const moduleAdapters of Object.values(adapters)) {
264
+ for (const entry of Object.values(moduleAdapters)) {
265
+ if (entry.type === "state-manager") {
266
+ factoryModuleSpecifiers.add(entry.factoryModule);
267
+ }
268
+ }
269
+ }
270
+ const passthroughRules = [...factoryModuleSpecifiers].map((specifier) => ({
271
+ specifierPrefix: specifier,
272
+ importerPattern: ADAPTER_PREFIX
273
+ }));
274
+ const plugin = {
163
275
  name: "vite-plugin-lds",
164
276
  enforce: "pre",
165
277
  async transform(code, id) {
@@ -207,7 +319,9 @@ function lds(overrides = {}) {
207
319
  return { code: s.toString(), map: s.generateMap({ hires: true }) };
208
320
  },
209
321
  resolveId(id) {
210
- if (graphqlSpecifiers.has(id)) return ADAPTER_ID_PREFIX + id;
322
+ if (graphqlSpecifiers.has(id) || stateManagerSpecifiers.has(id)) {
323
+ return ADAPTER_ID_PREFIX + id;
324
+ }
211
325
  if (id.startsWith(ADAPTER_PREFIX)) return ADAPTER_ID_PREFIX + id.slice(ADAPTER_PREFIX.length);
212
326
  return null;
213
327
  },
@@ -218,6 +332,10 @@ function lds(overrides = {}) {
218
332
  if (!moduleAdapters) return null;
219
333
  const lines = [adapterBaseSource];
220
334
  for (const [name, entry] of Object.entries(moduleAdapters)) {
335
+ if (entry.type === "state-manager") {
336
+ lines.push(buildStateManagerCompositionBody(name, entry, specifier));
337
+ continue;
338
+ }
221
339
  const { type, ...cfg } = entry;
222
340
  lines.push(
223
341
  `export const ${name} = ${factoryFor(type)}(${JSON.stringify(name)}, ${JSON.stringify(cfg)});`
@@ -229,6 +347,7 @@ function lds(overrides = {}) {
229
347
  return lines.join("\n");
230
348
  }
231
349
  };
350
+ return Object.assign(plugin, { passthroughRules });
232
351
  }
233
352
  export {
234
353
  lds
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/providers/lds/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 { JSONSchema } from \"@conduit-client/jsonschema-validate\";\nimport { init, parse } from \"es-module-lexer\";\nimport MagicString from \"magic-string\";\nimport type { Plugin } from \"vite\";\nimport type { ReadInvokerShape } from \"./types\";\n\n// prefix to write into transformed source code\nconst ADAPTER_PREFIX = \"sf-lds-adapter:\";\n// prefix used to ID the adapter when loading the virtual module\nconst ADAPTER_ID_PREFIX = \"\\0\" + ADAPTER_PREFIX;\n\n// the source of the adapter base module — reused across virtual modules so\n// each generated specifier emits the factories once.\n//\n// Top-level exports from the runtime module are stripped so every factory and\n// `gql` becomes a private binding inside the virtual module. The load hook\n// then controls exactly which names are exported per specifier: adapter\n// entries from the registry, plus `gql` for graphql specifiers. Without this,\n// the built `runtime.js` (trailing `export { …, gql, createWireAdapter, … }`)\n// and the source `runtime.ts` (per-declaration `export function gql …`) both\n// produce a `SyntaxError: Duplicate export of 'gql'` when the load hook also\n// appends `export { gql };`. They also leak the factory names as exports on\n// every LDS virtual module, which isn't a public contract we want.\nconst adapterBaseSource = stripTopLevelExports(\n\treadFileSync(join(dirname(fileURLToPath(import.meta.url)), \"runtime.js\"), \"utf-8\"),\n);\n\n/**\n * Removes top-level ES-module `export` keywords from the embedded runtime\n * source so its declarations survive as private bindings inside the virtual\n * module. Handles two shapes:\n * 1. Per-declaration: `export function foo …` / `export async function foo`\n * → the `export ` prefix is dropped.\n * 2. Trailing re-export clause: `export { foo, bar };` → deleted entirely.\n * Inner occurrences (inside function bodies, comments, strings) are not\n * affected because the source is a flat module with exports only at column 0.\n */\nfunction stripTopLevelExports(source: string): string {\n\treturn source\n\t\t.replace(/^export\\s+(?=(?:async\\s+)?function\\s)/gm, \"\")\n\t\t.replace(/^export\\s*\\{[^}]*};?\\s*$/gm, \"\");\n}\n\n/**\n * MCP dispatch descriptor. Nested under `mcp` on every adapter config so\n * additional MCP-specific fields (auth, transport, retry policy) can join\n * later without reshaping every consumer entry.\n */\nexport interface LdsAdapterMcpDispatch {\n\ttoolName: string;\n}\n\n/**\n * Base shape every LDS adapter config extends. Holds the dispatch surface in\n * one place so new backings (e.g. `http`) can land as sibling optional fields\n * without forking each adapter interface. Dual registration is supported at\n * the type level — runtime execution still targets a single backing per call.\n */\nexport interface LdsAdapterConfigBase {\n\tmcp?: LdsAdapterMcpDispatch;\n}\n\n/**\n * LDS adapter configs whose input is validated against a JSON Schema at\n * invoke time — wire, imperative-mutation, imperative-read. GraphQL variants\n * skip this base because they pass `{ query, variables }` through to the\n * configured MCP tool with no schema check.\n */\nexport interface LdsSchemaValidatedAdapterConfig extends LdsAdapterConfigBase {\n\tconfigJsonSchema: JSONSchema;\n}\n\nexport interface LdsWireAdapterConfig extends LdsSchemaValidatedAdapterConfig {\n\ttype: \"wire\";\n}\n\n/**\n * Imperative **mutation** adapter. Always an async\n * `(config) => Promise<Data>` that throws on validation or tool error —\n * matching OneStore's `DefaultImperativeBindingsService`, the only service a\n * mutation ever uses on platform. Mutations do not carry an `invokerShape`:\n * `subscribe`/`refresh` make no sense on write, and allowing them here\n * would drift off-platform from on-platform semantics.\n */\nexport interface LdsImperativeMutationAdapterConfig extends LdsSchemaValidatedAdapterConfig {\n\ttype: \"imperative-mutation\";\n}\n\n/**\n * Public alias for the read-shape union defined in `runtime.ts`. Re-exported\n * from this module so consumers don't have to import from the runtime entry\n * point, while keeping the union pinned to one source of truth.\n *\n * Off-platform there is no store, so `subscribe` is a deliberate no-op\n * (callback never fires, returned unsubscribe is idempotent) and `refresh`\n * re-executes the underlying MCP tool. This preserves the OneStore API\n * surface for code ported verbatim.\n */\nexport type LdsImperativeReadInvokerShape = ReadInvokerShape;\n\nexport interface LdsImperativeReadAdapterConfig extends LdsSchemaValidatedAdapterConfig {\n\ttype: \"imperative-read\";\n\tinvokerShape: LdsImperativeReadInvokerShape;\n}\n\n/**\n * GraphQL wire adapter. Emits `{ data, errors, refresh }` (distinct from the\n * base wire `{ data, error }`). No `configJsonSchema` — the adapter passes\n * `{ query, variables }` through to the configured MCP tool.\n */\nexport interface LdsGraphqlWireAdapterConfig extends LdsAdapterConfigBase {\n\ttype: \"graphql-wire\";\n}\n\n/**\n * Imperative GraphQL mutation — `(config) => Promise<{ data, errors }>`.\n * Errors are routed in-band to the `errors[]` envelope rather than thrown,\n * matching on-platform `toGraphQLResponseFromFailure`.\n */\nexport interface LdsGraphqlMutationAdapterConfig extends LdsAdapterConfigBase {\n\ttype: \"graphql-mutation\";\n}\n\n/**\n * Read-shape discriminator for imperative GraphQL adapters. Mirrors the\n * `imperative-read` `invokerShape` field so the two families share a pattern:\n * one `type` discriminator + a shape field that selects the return surface.\n *\n * - `query` — `Promise<{ data, errors, subscribe }>` (on-platform\n * `GraphQLImperativeBindingsService` without `exposeRefresh`).\n * - `query-refreshable` — `Promise<{ data, errors, subscribe, refresh }>`\n * (same service with `exposeRefresh: true`).\n * - `legacy` — `{ invoke(config, context, callback),\n * subscribe(config, context, callback): Unsubscribe }`, the older callback\n * surface served by `GraphQLLegacyImperativeBindingsService`.\n *\n * `subscribe` is a deliberate no-op off-platform (no reactive store).\n */\nexport type LdsGraphqlImperativeReadInvokerShape = \"query\" | \"query-refreshable\" | \"legacy\";\n\n/**\n * Imperative GraphQL read adapter. The `invokerShape` picks the return\n * surface — see {@link LdsGraphqlImperativeReadInvokerShape}. Errors are\n * routed in-band to `errors[]` (for `query`/`query-refreshable`) or into the\n * callback payload (for `legacy`); no shape throws on tool errors.\n */\nexport interface LdsGraphqlImperativeReadAdapterConfig extends LdsAdapterConfigBase {\n\ttype: \"graphql-imperative-read\";\n\tinvokerShape: LdsGraphqlImperativeReadInvokerShape;\n}\n\nexport type LdsAdapterConfig =\n\t| LdsWireAdapterConfig\n\t| LdsImperativeMutationAdapterConfig\n\t| LdsImperativeReadAdapterConfig\n\t| LdsGraphqlWireAdapterConfig\n\t| LdsGraphqlMutationAdapterConfig\n\t| LdsGraphqlImperativeReadAdapterConfig;\n\nexport type LdsAdapterRegistry = Record<string, Record<string, LdsAdapterConfig>>;\n\n/**\n * Default adapter registry.\n * Maps LDS module specifiers to MCP tool-backed implementations. Entries can be\n * wire adapters (`type: 'wire'`), imperative mutations (`type: 'imperative-mutation'`),\n * or imperative reads (`type: 'imperative-read'` + `invokerShape`).\n * Add entries here to support additional lightning/* exports.\n */\nconst DEFAULT_ADAPTERS: LdsAdapterRegistry = {\n\t\"lightning/uiRecordApi\": {\n\t\tgetRecord: {\n\t\t\ttype: \"wire\",\n\t\t\tmcp: { toolName: \"getRecordMcpTool\" },\n\t\t\tconfigJsonSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\trecordId: { type: \"string\" },\n\t\t\t\t\tlayoutTypes: {\n\t\t\t\t\t\tanyOf: [{ type: \"array\", items: { type: \"string\" } }, { type: \"null\" }],\n\t\t\t\t\t},\n\t\t\t\t\tfields: {\n\t\t\t\t\t\tanyOf: [{ type: \"array\", items: { type: \"string\" } }, { type: \"null\" }],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [\"recordId\"],\n\t\t\t\tadditionalProperties: false,\n\t\t\t\tanyOf: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\tfields: { type: \"array\", items: { type: \"string\" }, minItems: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\trequired: [\"fields\"],\n\t\t\t\t\t\tadditionalProperties: true,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\tlayoutTypes: {\n\t\t\t\t\t\t\t\ttype: \"array\",\n\t\t\t\t\t\t\t\titems: { type: \"string\" },\n\t\t\t\t\t\t\t\tminItems: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\trequired: [\"layoutTypes\"],\n\t\t\t\t\t\tadditionalProperties: true,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\tcreateRecord: {\n\t\t\ttype: \"imperative-mutation\",\n\t\t\tmcp: { toolName: \"createRecordMcpTool\" },\n\t\t\tconfigJsonSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\tapiName: { type: \"string\" },\n\t\t\t\t\tfields: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {},\n\t\t\t\t\t\trequired: [],\n\t\t\t\t\t\tadditionalProperties: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [\"apiName\", \"fields\"],\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t},\n\t\tupdateRecord: {\n\t\t\ttype: \"imperative-mutation\",\n\t\t\tmcp: { toolName: \"updateRecordMcpTool\" },\n\t\t\tconfigJsonSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\trecordId: { type: \"string\" },\n\t\t\t\t\tfields: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {},\n\t\t\t\t\t\trequired: [],\n\t\t\t\t\t\tadditionalProperties: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [\"recordId\", \"fields\"],\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t},\n\t},\n\t\"lightning/uiObjectInfoApi\": {\n\t\t// On-platform this is a `{ invoke, subscribe }` callback surface\n\t\t// emitting `{ data, error }`. The legacy invoker shape preserves that\n\t\t// contract verbatim, so ported consumers keep their call sites.\n\t\tgetObjectInfo_imperative: {\n\t\t\ttype: \"imperative-read\",\n\t\t\tinvokerShape: \"legacy\",\n\t\t\tmcp: { toolName: \"getObjectInfoMcpTool\" },\n\t\t\tconfigJsonSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\tobjectApiName: { type: \"string\" },\n\t\t\t\t},\n\t\t\t\trequired: [\"objectApiName\"],\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t},\n\t},\n\t// `lightning/graphql` — on-platform exports `gql`, the `graphql` wire\n\t// adapter, and `executeMutation`. Only `graphql` and `executeMutation`\n\t// are registry entries; `gql` rides along automatically for any specifier\n\t// that has at least one graphql-typed entry (emitted by the load hook).\n\t\"lightning/graphql\": {\n\t\tgraphql: { type: \"graphql-wire\", mcp: { toolName: \"graphqlQuery\" } },\n\t\texecuteMutation: { type: \"graphql-mutation\", mcp: { toolName: \"graphqlQuery\" } },\n\t},\n};\n\n/** True when any entry in a module's adapter map is a `graphql-*` type. */\nfunction isGraphqlSpecifier(moduleAdapters: Record<string, LdsAdapterConfig>): boolean {\n\treturn Object.values(moduleAdapters).some(\n\t\t(entry) =>\n\t\t\tentry.type === \"graphql-wire\" ||\n\t\t\tentry.type === \"graphql-mutation\" ||\n\t\t\tentry.type === \"graphql-imperative-read\",\n\t);\n}\n\n/** Maps a config discriminator to the factory name emitted in the virtual module. */\nfunction factoryFor(type: LdsAdapterConfig[\"type\"]): string {\n\tswitch (type) {\n\t\tcase \"wire\":\n\t\t\treturn \"createWireAdapter\";\n\t\tcase \"imperative-mutation\":\n\t\t\treturn \"createMutationAdapter\";\n\t\tcase \"imperative-read\":\n\t\t\treturn \"createReadAdapter\";\n\t\tcase \"graphql-wire\":\n\t\t\treturn \"createGraphQLWireAdapter\";\n\t\tcase \"graphql-mutation\":\n\t\t\treturn \"createGraphQLMutationAdapter\";\n\t\tcase \"graphql-imperative-read\":\n\t\t\treturn \"createGraphQLImperativeReadAdapter\";\n\t}\n}\n\nfunction parseImportSpecifiers(bracesContent: string): { original: string; full: string }[] {\n\treturn bracesContent\n\t\t.split(\",\")\n\t\t.map((s) => s.trim())\n\t\t.filter(Boolean)\n\t\t.map((entry) => {\n\t\t\tconst asIdx = entry.indexOf(\" as \");\n\t\t\tconst original = asIdx !== -1 ? entry.slice(0, asIdx).trim() : entry.trim();\n\t\t\treturn { original, full: entry };\n\t\t});\n}\n\n/**\n * Deep-merges user overrides onto the default registry: every specifier from\n * both sides is preserved, and per-specifier entries are merged so a consumer\n * can override `getRecord` without losing `createRecord`, or register a new\n * entry on `lightning/graphql` without losing `graphql` / `executeMutation`.\n * Pass an empty object to get just the defaults. To opt out of a default\n * entry, pass the same specifier with a different entry of the same key.\n */\nfunction mergeWithDefaults(overrides: LdsAdapterRegistry): LdsAdapterRegistry {\n\tconst merged: LdsAdapterRegistry = { ...DEFAULT_ADAPTERS };\n\tfor (const [specifier, entries] of Object.entries(overrides)) {\n\t\tmerged[specifier] = { ...(DEFAULT_ADAPTERS[specifier] ?? {}), ...entries };\n\t}\n\treturn merged;\n}\n\n/**\n * LDS provider — rewrites registered `lightning/*` imports (e.g.\n * `lightning/uiRecordApi`) to MCP-tool-backed virtual modules. Unregistered\n * exports pass through to the normal `lightning/*` resolution.\n *\n * Three Vite hooks do the work:\n *\n * - **`transform`** — parses each `.js` / `.ts` file with `es-module-lexer`,\n * finds named imports from registered specifiers, and rewrites them to pull\n * registered names from `sf-lds-adapter:<specifier>` while leaving\n * unregistered names pointing at the original specifier.\n *\n * - **`resolveId`** — maps `sf-lds-adapter:<specifier>` to a `\\0`-prefixed\n * virtual module ID, preventing Rollup from attempting a filesystem lookup.\n *\n * - **`load`** — generates the virtual module, emitting an MCP-backed\n * `createWireAdapter(...)` class for every `type: 'wire'` entry,\n * `createMutationAdapter(...)` for every `type: 'imperative-mutation'` entry,\n * and `createReadAdapter(...)` for every `type: 'imperative-read'` entry.\n *\n * Only specifiers present in the `adapters` registry are intercepted; imports from\n * unregistered specifiers pass through unchanged.\n */\nexport function lds(overrides: LdsAdapterRegistry = {}): Plugin {\n\tconst adapters = mergeWithDefaults(overrides);\n\t// Graphql specifiers are owned whole by the virtual module — every export\n\t// (adapters + `gql`) lives there, so the transform hook should not split\n\t// their imports. Non-graphql specifiers still go through transform so\n\t// unregistered names pass through to the real `lightning/*` module.\n\tconst graphqlSpecifiers = new Set<string>(\n\t\tObject.entries(adapters)\n\t\t\t.filter(([, moduleAdapters]) => isGraphqlSpecifier(moduleAdapters))\n\t\t\t.map(([specifier]) => specifier),\n\t);\n\tconst transformSpecifiers = Object.keys(adapters).filter((s) => !graphqlSpecifiers.has(s));\n\tconst specifierSnippets = transformSpecifiers.flatMap((s) => [`'${s}'`, `\"${s}\"`]);\n\n\treturn {\n\t\tname: \"vite-plugin-lds\",\n\t\tenforce: \"pre\",\n\n\t\tasync transform(code, id) {\n\t\t\tconst cleanId = id.split(\"?\")[0] ?? id;\n\t\t\tif (!cleanId.endsWith(\".js\") && !cleanId.endsWith(\".ts\")) return null;\n\t\t\tif (cleanId.includes(\"/node_modules/\")) return null;\n\t\t\tif (!specifierSnippets.some((snippet) => code.includes(snippet))) return null;\n\n\t\t\tawait init;\n\n\t\t\tlet imports: ReturnType<typeof parse>[0];\n\t\t\ttry {\n\t\t\t\t[imports] = parse(code);\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst relevant = imports.filter(\n\t\t\t\t(imp) =>\n\t\t\t\t\timp.d === -1 && imp.n !== undefined && imp.n in adapters && !graphqlSpecifiers.has(imp.n),\n\t\t\t);\n\t\t\tif (relevant.length === 0) return null;\n\n\t\t\tconst s = new MagicString(code);\n\t\t\tlet changed = false;\n\n\t\t\tfor (const imp of relevant) {\n\t\t\t\tconst { ss: start, se: end, n: specifier } = imp;\n\t\t\t\tconst statement = code.slice(start, end);\n\n\t\t\t\tconst openBrace = statement.indexOf(\"{\");\n\t\t\t\tconst closeBrace = statement.indexOf(\"}\");\n\t\t\t\tif (openBrace === -1 || closeBrace === -1) continue;\n\n\t\t\t\tconst bracesContent = statement.slice(openBrace + 1, closeBrace);\n\t\t\t\tconst moduleAdapters = adapters[specifier!]!;\n\t\t\t\tconst parsedImport = parseImportSpecifiers(bracesContent);\n\t\t\t\tconst registered = parsedImport.filter((p) => p.original in moduleAdapters);\n\t\t\t\tconst unregistered = parsedImport.filter((p) => !(p.original in moduleAdapters));\n\n\t\t\t\tif (registered.length === 0) continue;\n\n\t\t\t\tconst parts: string[] = [\n\t\t\t\t\t`import { ${registered.map((p) => p.full).join(\", \")} } from '${ADAPTER_PREFIX}${specifier}';`,\n\t\t\t\t];\n\n\t\t\t\tif (unregistered.length > 0) {\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t`import { ${unregistered.map((p) => p.full).join(\", \")} } from '${specifier}';`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\ts.overwrite(start, end, parts.join(\"\\n\"));\n\t\t\t\tchanged = true;\n\t\t\t}\n\n\t\t\tif (!changed) return null;\n\t\t\treturn { code: s.toString(), map: s.generateMap({ hires: true }) };\n\t\t},\n\n\t\tresolveId(id) {\n\t\t\t// Graphql specifiers are intercepted raw — no transform hook split\n\t\t\t// — and mapped into the same `\\0sf-lds-adapter:` virtual namespace\n\t\t\t// so the load hook emits one module per specifier.\n\t\t\tif (graphqlSpecifiers.has(id)) return ADAPTER_ID_PREFIX + id;\n\t\t\tif (id.startsWith(ADAPTER_PREFIX)) return ADAPTER_ID_PREFIX + id.slice(ADAPTER_PREFIX.length);\n\t\t\treturn null;\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (!id.startsWith(ADAPTER_ID_PREFIX)) return null;\n\n\t\t\tconst specifier = id.slice(ADAPTER_ID_PREFIX.length);\n\t\t\tconst moduleAdapters = adapters[specifier];\n\t\t\tif (!moduleAdapters) return null;\n\n\t\t\t// create lines of code used to create MCP tool based adapters\n\t\t\tconst lines: string[] = [adapterBaseSource];\n\t\t\tfor (const [name, entry] of Object.entries(moduleAdapters)) {\n\t\t\t\tconst { type, ...cfg } = entry;\n\t\t\t\tlines.push(\n\t\t\t\t\t`export const ${name} = ${factoryFor(type)}(${JSON.stringify(name)}, ${JSON.stringify(cfg)});`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// `gql` rides along with any specifier that declares a graphql\n\t\t\t// adapter, so `import { gql } from 'lightning/graphql'` (or any\n\t\t\t// aliased form) keeps resolving even when no adapters are\n\t\t\t// imported alongside it. The binding itself is a private function\n\t\t\t// inside `adapterBaseSource` after `stripTopLevelExports`.\n\t\t\tif (graphqlSpecifiers.has(specifier)) {\n\t\t\t\tlines.push(\"export { gql };\");\n\t\t\t}\n\t\t\treturn lines.join(\"\\n\");\n\t\t},\n\t};\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/providers/lds/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 { JSONSchema } from \"@conduit-client/jsonschema-validate\";\nimport { init, parse } from \"es-module-lexer\";\nimport MagicString from \"magic-string\";\nimport type { Plugin } from \"vite\";\nimport type { ReadInvokerShape } from \"./types\";\nimport type { PassthroughRule } from \"../../types\";\n\n// prefix to write into transformed source code\nconst ADAPTER_PREFIX = \"sf-lds-adapter:\";\n// prefix used to ID the adapter when loading the virtual module\nconst ADAPTER_ID_PREFIX = \"\\0\" + ADAPTER_PREFIX;\n\n// the source of the adapter base module — reused across virtual modules so\n// each generated specifier emits the factories once.\n//\n// Top-level exports from the runtime module are stripped so every factory and\n// `gql` becomes a private binding inside the virtual module. The load hook\n// then controls exactly which names are exported per specifier: adapter\n// entries from the registry, plus `gql` for graphql specifiers. Without this,\n// the built `runtime.js` (trailing `export { …, gql, createWireAdapter, … }`)\n// and the source `runtime.ts` (per-declaration `export function gql …`) both\n// produce a `SyntaxError: Duplicate export of 'gql'` when the load hook also\n// appends `export { gql };`. They also leak the factory names as exports on\n// every LDS virtual module, which isn't a public contract we want.\nconst adapterBaseSource = stripTopLevelExports(\n\treadFileSync(join(dirname(fileURLToPath(import.meta.url)), \"runtime.js\"), \"utf-8\"),\n);\n\n/**\n * Removes top-level ES-module `export` keywords from the embedded runtime\n * source so its declarations survive as private bindings inside the virtual\n * module. Handles two shapes:\n * 1. Per-declaration: `export function foo …` / `export async function foo`\n * → the `export ` prefix is dropped.\n * 2. Trailing re-export clause: `export { foo, bar };` → deleted entirely.\n * Inner occurrences (inside function bodies, comments, strings) are not\n * affected because the source is a flat module with exports only at column 0.\n */\nfunction stripTopLevelExports(source: string): string {\n\treturn source\n\t\t.replace(/^export\\s+(?=(?:async\\s+)?function\\s)/gm, \"\")\n\t\t.replace(/^export\\s*\\{[^}]*};?\\s*$/gm, \"\");\n}\n\n/**\n * MCP dispatch descriptor. Nested under `mcp` on every adapter config so\n * additional MCP-specific fields (auth, transport, retry policy) can join\n * later without reshaping every consumer entry.\n */\nexport interface LdsAdapterMcpDispatch {\n\ttoolName: string;\n}\n\n/**\n * Base shape every LDS adapter config extends. Holds the dispatch surface in\n * one place so new backings (e.g. `http`) can land as sibling optional fields\n * without forking each adapter interface. Dual registration is supported at\n * the type level — runtime execution still targets a single backing per call.\n */\nexport interface LdsAdapterConfigBase {\n\tmcp?: LdsAdapterMcpDispatch;\n}\n\n/**\n * LDS adapter configs whose input is validated against a JSON Schema at\n * invoke time — wire, imperative-mutation, imperative-read. GraphQL variants\n * skip this base because they pass `{ query, variables }` through to the\n * configured MCP tool with no schema check.\n */\nexport interface LdsSchemaValidatedAdapterConfig extends LdsAdapterConfigBase {\n\tconfigJsonSchema: JSONSchema;\n}\n\nexport interface LdsWireAdapterConfig extends LdsSchemaValidatedAdapterConfig {\n\ttype: \"wire\";\n}\n\n/**\n * Imperative **mutation** adapter. Always an async\n * `(config) => Promise<Data>` that throws on validation or tool error —\n * matching OneStore's `DefaultImperativeBindingsService`, the only service a\n * mutation ever uses on platform. Mutations do not carry an `invokerShape`:\n * `subscribe`/`refresh` make no sense on write, and allowing them here\n * would drift off-platform from on-platform semantics.\n */\nexport interface LdsImperativeMutationAdapterConfig extends LdsSchemaValidatedAdapterConfig {\n\ttype: \"imperative-mutation\";\n}\n\n/**\n * Public alias for the read-shape union defined in `runtime.ts`. Re-exported\n * from this module so consumers don't have to import from the runtime entry\n * point, while keeping the union pinned to one source of truth.\n *\n * Off-platform there is no store, so `subscribe` is a deliberate no-op\n * (callback never fires, returned unsubscribe is idempotent) and `refresh`\n * re-executes the underlying MCP tool. This preserves the OneStore API\n * surface for code ported verbatim.\n */\nexport type LdsImperativeReadInvokerShape = ReadInvokerShape;\n\nexport interface LdsImperativeReadAdapterConfig extends LdsSchemaValidatedAdapterConfig {\n\ttype: \"imperative-read\";\n\tinvokerShape: LdsImperativeReadInvokerShape;\n}\n\n/**\n * GraphQL wire adapter. Emits `{ data, errors, refresh }` (distinct from the\n * base wire `{ data, error }`). No `configJsonSchema` — the adapter passes\n * `{ query, variables }` through to the configured MCP tool.\n */\nexport interface LdsGraphqlWireAdapterConfig extends LdsAdapterConfigBase {\n\ttype: \"graphql-wire\";\n}\n\n/**\n * Imperative GraphQL mutation — `(config) => Promise<{ data, errors }>`.\n * Errors are routed in-band to the `errors[]` envelope rather than thrown,\n * matching on-platform `toGraphQLResponseFromFailure`.\n */\nexport interface LdsGraphqlMutationAdapterConfig extends LdsAdapterConfigBase {\n\ttype: \"graphql-mutation\";\n}\n\n/**\n * Read-shape discriminator for imperative GraphQL adapters. Mirrors the\n * `imperative-read` `invokerShape` field so the two families share a pattern:\n * one `type` discriminator + a shape field that selects the return surface.\n *\n * - `query` — `Promise<{ data, errors, subscribe }>` (on-platform\n * `GraphQLImperativeBindingsService` without `exposeRefresh`).\n * - `query-refreshable` — `Promise<{ data, errors, subscribe, refresh }>`\n * (same service with `exposeRefresh: true`).\n * - `legacy` — `{ invoke(config, context, callback),\n * subscribe(config, context, callback): Unsubscribe }`, the older callback\n * surface served by `GraphQLLegacyImperativeBindingsService`.\n *\n * `subscribe` is a deliberate no-op off-platform (no reactive store).\n */\nexport type LdsGraphqlImperativeReadInvokerShape = \"query\" | \"query-refreshable\" | \"legacy\";\n\n/**\n * Imperative GraphQL read adapter. The `invokerShape` picks the return\n * surface — see {@link LdsGraphqlImperativeReadInvokerShape}. Errors are\n * routed in-band to `errors[]` (for `query`/`query-refreshable`) or into the\n * callback payload (for `legacy`); no shape throws on tool errors.\n */\nexport interface LdsGraphqlImperativeReadAdapterConfig extends LdsAdapterConfigBase {\n\ttype: \"graphql-imperative-read\";\n\tinvokerShape: LdsGraphqlImperativeReadInvokerShape;\n}\n\n/**\n * State-manager adapter config. The lds plugin's load hook emits a\n * factory-composition body for each state-manager registry entry — see\n * `buildStateManagerCompositionBody`. Two emit shapes:\n *\n * - **UIAPI** (`lightning/stateManagerRecord`, `…ObjectInfo`) — synthesizes\n * a legacy-shape imperative-read adapter inline via `createReadAdapter`\n * and feeds it into the upstream per-state-manager factory\n * (`createSmRecord` / `createSmObjectInfo`) re-exported from\n * `@salesforce/state-managers-uiapi/factory`.\n *\n * - **GraphQL** (`lightning/stateManagerGraphQL`) — calls the upstream\n * per-state-manager factory `createSmGraphQL` re-exported from\n * `@salesforce/lds-adapters-onestore-graphql/factory` with an MCP-backed\n * `getCommand` synthesized via `createGraphqlStateManagerCommand` (a\n * `runtime.ts` helper). The required / optional config keys\n * (`['query']`, `['variables', 'operationName']`) live in the upstream\n * factory — a fixed contract of `lightning/stateManagerGraphQL` — so the\n * load-hook emit doesn't pass them. Mirrors the UIAPI shape (one\n * factory call, adapter argument only).\n *\n * Per-state-manager metadata (definedBy, requiredKeys, optionalKeys,\n * predicate) lives in the upstream factory — not here. See spec §8.4 / §10.4.\n *\n * `configJsonSchema` is optional: UIAPI state managers supply it (the\n * load hook embeds it in the synthesized imperative-read adapter), but\n * the graphql state-manager path doesn't read it (off-core graphql\n * forgoes the on-core `assertIsValid` / `resolveAndValidateGraphQLConfig`\n * validation layer; spec §4 Non-goal 9 — malformed configs surface as\n * MCP tool errors at execute time instead).\n */\nexport interface LdsStateManagerAdapterConfig extends LdsAdapterConfigBase {\n\ttype: \"state-manager\";\n\t/** Upstream factory specifier — e.g. '@salesforce/state-managers-uiapi/factory'. */\n\tfactoryModule: string;\n\t/** Named export within `factoryModule` — e.g. 'createSmRecord' (UIAPI), 'createSmGraphQL' (graphql). */\n\tfactoryName: string;\n\t/** JSON Schema for the config object — required for UIAPI state managers, omitted for graphql. */\n\tconfigJsonSchema?: JSONSchema;\n}\n\nexport type LdsAdapterConfig =\n\t| LdsWireAdapterConfig\n\t| LdsImperativeMutationAdapterConfig\n\t| LdsImperativeReadAdapterConfig\n\t| LdsGraphqlWireAdapterConfig\n\t| LdsGraphqlMutationAdapterConfig\n\t| LdsGraphqlImperativeReadAdapterConfig\n\t| LdsStateManagerAdapterConfig;\n\nexport type LdsAdapterRegistry = Record<string, Record<string, LdsAdapterConfig>>;\n\n// ─── Per-resource shared constants ────────────────────────────────────────────\n// Tool names and JSON Schemas extracted from the registry so wire / imperative\n// siblings backed by the same MCP tool reference one source of truth. Mutation\n// adapters keep their own dedicated tools and schemas because their dispatch\n// surface is distinct (different tool name, different validated input).\n\nconst RECORD_TOOL = \"getRecordMcpTool\";\nconst RECORD_SCHEMA: JSONSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\trecordId: { type: \"string\" },\n\t\tlayoutTypes: {\n\t\t\tanyOf: [{ type: \"array\", items: { type: \"string\" } }, { type: \"null\" }],\n\t\t},\n\t\tfields: {\n\t\t\tanyOf: [{ type: \"array\", items: { type: \"string\" } }, { type: \"null\" }],\n\t\t},\n\t},\n\trequired: [\"recordId\"],\n\tadditionalProperties: false,\n\tanyOf: [\n\t\t{\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tfields: { type: \"array\", items: { type: \"string\" }, minItems: 1 },\n\t\t\t},\n\t\t\trequired: [\"fields\"],\n\t\t\tadditionalProperties: true,\n\t\t},\n\t\t{\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tlayoutTypes: {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems: { type: \"string\" },\n\t\t\t\t\tminItems: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t\trequired: [\"layoutTypes\"],\n\t\t\tadditionalProperties: true,\n\t\t},\n\t],\n};\n\nconst OBJECT_INFO_TOOL = \"getObjectInfoMcpTool\";\nconst OBJECT_INFO_SCHEMA: JSONSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tobjectApiName: { type: \"string\" },\n\t},\n\trequired: [\"objectApiName\"],\n\tadditionalProperties: false,\n};\n\nconst GRAPHQL_TOOL = \"graphqlQuery\";\n\n/**\n * Default adapter registry.\n * Maps LDS module specifiers to MCP tool-backed implementations. Entries can be\n * wire adapters (`type: 'wire'`), imperative mutations (`type: 'imperative-mutation'`),\n * or imperative reads (`type: 'imperative-read'` + `invokerShape`).\n * Add entries here to support additional lightning/* exports.\n */\nconst DEFAULT_ADAPTERS: LdsAdapterRegistry = {\n\t\"lightning/uiRecordApi\": {\n\t\tgetRecord: {\n\t\t\ttype: \"wire\",\n\t\t\tmcp: { toolName: RECORD_TOOL },\n\t\t\tconfigJsonSchema: RECORD_SCHEMA,\n\t\t},\n\t\tcreateRecord: {\n\t\t\ttype: \"imperative-mutation\",\n\t\t\tmcp: { toolName: \"createRecordMcpTool\" },\n\t\t\tconfigJsonSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\tapiName: { type: \"string\" },\n\t\t\t\t\tfields: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {},\n\t\t\t\t\t\trequired: [],\n\t\t\t\t\t\tadditionalProperties: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [\"apiName\", \"fields\"],\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t},\n\t\tupdateRecord: {\n\t\t\ttype: \"imperative-mutation\",\n\t\t\tmcp: { toolName: \"updateRecordMcpTool\" },\n\t\t\tconfigJsonSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\trecordId: { type: \"string\" },\n\t\t\t\t\tfields: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {},\n\t\t\t\t\t\trequired: [],\n\t\t\t\t\t\tadditionalProperties: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [\"recordId\", \"fields\"],\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t},\n\t},\n\t\"lightning/uiObjectInfoApi\": {\n\t\t// On-platform this is a `{ invoke, subscribe }` callback surface\n\t\t// emitting `{ data, error }`. The legacy invoker shape preserves that\n\t\t// contract verbatim, so ported consumers keep their call sites.\n\t\tgetObjectInfo_imperative: {\n\t\t\ttype: \"imperative-read\",\n\t\t\tinvokerShape: \"legacy\",\n\t\t\tmcp: { toolName: OBJECT_INFO_TOOL },\n\t\t\tconfigJsonSchema: OBJECT_INFO_SCHEMA,\n\t\t},\n\t},\n\t// `lightning/graphql` — on-platform exports `gql`, the `graphql` wire\n\t// adapter, and `executeMutation`. Only `graphql` and `executeMutation`\n\t// are registry entries; `gql` rides along automatically for any specifier\n\t// that has at least one graphql-typed entry (emitted by the load hook).\n\t\"lightning/graphql\": {\n\t\tgraphql: { type: \"graphql-wire\", mcp: { toolName: GRAPHQL_TOOL } },\n\t\texecuteMutation: { type: \"graphql-mutation\", mcp: { toolName: GRAPHQL_TOOL } },\n\t},\n\t// `lightning/stateManagerGraphQL` — externalized graphql state manager.\n\t// The load hook imports `createSmGraphQL` from the upstream\n\t// `@salesforce/lds-adapters-onestore-graphql/factory` barrel — a thin\n\t// per-state-manager wrapper around `createStateManager` that bakes in\n\t// the required (`['query']`) / optional (`['variables', 'operationName']`)\n\t// config keys, mirroring `createSmRecord` / `createSmObjectInfo`. The\n\t// same factory wraps the call site on-core via `bindings/bindings.ts`,\n\t// so off-core composition fidelity is preserved without on-core service\n\t// plumbing leaking into this side.\n\t//\n\t// Per §10.3 the registry only ever has `default` as its key — the\n\t// `createSmGraphQL` return value is itself the `default` export of\n\t// the virtual module.\n\t//\n\t// `configJsonSchema` is omitted: off-core graphql forgoes the on-core\n\t// `assertIsValid` / `resolveAndValidateGraphQLConfig` validation layer\n\t// (§4 Non-goal 9), and the load-hook graphql path doesn't read the\n\t// field anyway — malformed configs surface as MCP tool errors at\n\t// execute time instead.\n\t\"lightning/stateManagerGraphQL\": {\n\t\tdefault: {\n\t\t\ttype: \"state-manager\",\n\t\t\tfactoryModule: \"@salesforce/lds-adapters-onestore-graphql/factory\",\n\t\t\tfactoryName: \"createSmGraphQL\",\n\t\t\tmcp: { toolName: GRAPHQL_TOOL },\n\t\t},\n\t},\n\t// State-manager specifier for ObjectInfo (spec §8.3 / §10.3). The load hook\n\t// synthesizes a legacy-shape imperative-read adapter inline from\n\t// (mcp.toolName, configJsonSchema) and feeds it to the upstream\n\t// `createSmObjectInfo` factory. Reuses the shared `OBJECT_INFO_TOOL` /\n\t// `OBJECT_INFO_SCHEMA` so this entry stays in lock-step with the\n\t// `lightning/uiObjectInfoApi.getObjectInfo_imperative` entry above —\n\t// both back the same UIAPI ObjectInfo MCP tool.\n\t\"lightning/stateManagerObjectInfo\": {\n\t\tdefault: {\n\t\t\ttype: \"state-manager\",\n\t\t\tfactoryModule: \"@salesforce/state-managers-uiapi/factory\",\n\t\t\tfactoryName: \"createSmObjectInfo\",\n\t\t\tmcp: { toolName: OBJECT_INFO_TOOL },\n\t\t\tconfigJsonSchema: OBJECT_INFO_SCHEMA,\n\t\t},\n\t},\n\t// `lightning/stateManagerRecord` — UIAPI Record state-manager. Per spec\n\t// §10.3 the registry only ever has a single `default` key; the load hook\n\t// synthesizes a legacy-shape imperative-read adapter from\n\t// (mcp.toolName, configJsonSchema) and feeds it into the upstream\n\t// `createSmRecord` factory to produce the externalized state manager.\n\t// Reuses the shared `RECORD_TOOL` / `RECORD_SCHEMA` so the wire and\n\t// state-manager paths stay anchored to a single MCP-tool / config\n\t// contract.\n\t\"lightning/stateManagerRecord\": {\n\t\tdefault: {\n\t\t\ttype: \"state-manager\",\n\t\t\tfactoryModule: \"@salesforce/state-managers-uiapi/factory\",\n\t\t\tfactoryName: \"createSmRecord\",\n\t\t\tmcp: { toolName: RECORD_TOOL },\n\t\t\tconfigJsonSchema: RECORD_SCHEMA,\n\t\t},\n\t},\n};\n\n/** True when any entry in a module's adapter map is a `graphql-*` type. */\nfunction isGraphqlSpecifier(moduleAdapters: Record<string, LdsAdapterConfig>): boolean {\n\treturn Object.values(moduleAdapters).some(\n\t\t(entry) =>\n\t\t\tentry.type === \"graphql-wire\" ||\n\t\t\tentry.type === \"graphql-mutation\" ||\n\t\t\tentry.type === \"graphql-imperative-read\",\n\t);\n}\n\n/** True when any entry in a module's adapter map is a `state-manager` type. */\nfunction isStateManagerSpecifier(moduleAdapters: Record<string, LdsAdapterConfig>): boolean {\n\treturn Object.values(moduleAdapters).some((entry) => entry.type === \"state-manager\");\n}\n\n/**\n * True when a state-manager specifier resolves to the graphql state manager\n * (`lightning/stateManagerGraphQL`). Used by `buildStateManagerCompositionBody`\n * to pick which emit shape to use:\n *\n * - GraphQL — call upstream `createSmGraphQL` with an MCP-backed\n * `getCommand` from `createGraphqlStateManagerCommand`. Required/optional\n * key sets (`['query']` / `['variables', 'operationName']`) live in the\n * upstream factory; the load-hook emit doesn't pass them.\n * - UIAPI — synthesize a legacy-shape imperative-read adapter inline via\n * `createReadAdapter` and feed it into the per-state-manager wrapper\n * (`createSmRecord` / `createSmObjectInfo`).\n *\n * Selecting on the specifier (rather than the registry entry's `type`)\n * mirrors §8.4 of the spec and keeps the `LdsStateManagerAdapterConfig`\n * surface free of an inner discriminator — consumers add a state-manager\n * registry entry once and the plugin picks the right emit shape.\n */\nfunction isGraphqlStateManagerSpecifier(specifier: string): boolean {\n\treturn specifier === \"lightning/stateManagerGraphQL\";\n}\n\n/**\n * Builds the §8.4 factory-composition body for a single `state-manager`\n * registry entry. Two emit shapes, gated by `isGraphqlStateManagerSpecifier`:\n *\n * **UIAPI shape** — `lightning/stateManagerRecord`, `…ObjectInfo`:\n *\n * import { <factoryName> } from \"<factoryModule>\";\n * const __cfg_<name> = { type: 'imperative-read', invokerShape: 'legacy', mcp, configJsonSchema };\n * const __imperativeAdapter_<name> = createReadAdapter(<name>, __cfg_<name>);\n * export default <factoryName>(__imperativeAdapter_<name>);\n *\n * Synthesizes a legacy-shape imperative-read adapter inline (private binding\n * in scope via `adapterBaseSource`), then default-exports the upstream\n * per-state-manager wrapper (`createSmRecord` / `createSmObjectInfo`)\n * applied to it.\n *\n * **GraphQL shape** — `lightning/stateManagerGraphQL`:\n *\n * import { createSmGraphQL } from \"@salesforce/lds-adapters-onestore-graphql/factory\";\n * const __getCommand_<name> = createGraphqlStateManagerCommand(<name>, { mcp });\n * export default createSmGraphQL(__getCommand_<name>);\n *\n * Calls upstream `createSmGraphQL` (re-exported from\n * `bindings/graphql.factory.ts` — the same factory on-core composition\n * wraps internally) with an MCP-backed `getCommand` from\n * `createGraphqlStateManagerCommand` (a `runtime.ts` helper, in scope as a\n * private binding). Required / optional config keys are baked into the\n * upstream factory — they're a fixed contract of\n * `lightning/stateManagerGraphQL`, not a per-registry-entry parameter, so\n * the load-hook emit doesn't carry them. `configJsonSchema` is ignored on\n * this path (graphql off-core forgoes the on-core `assertIsValid` /\n * `resolveAndValidateGraphQLConfig` validation layer; spec §4 Non-goal 9).\n *\n * Only `default` is exported in either shape. The upstream `<name>_internal`\n * named export (used internally by `state-managers-uiapi` for\n * cross-state-manager wiring and tests) is deliberately not re-exported —\n * uplifted customer LWCs only consume the default. See spec §8.4 / §10.4.\n */\nfunction buildStateManagerCompositionBody(\n\tname: string,\n\tcfg: LdsStateManagerAdapterConfig,\n\tspecifier: string,\n): string {\n\tif (isGraphqlStateManagerSpecifier(specifier)) {\n\t\tconst graphqlCfg = { mcp: { toolName: cfg.mcp?.toolName } };\n\t\treturn [\n\t\t\t`import { ${cfg.factoryName} } from ${JSON.stringify(cfg.factoryModule)};`,\n\t\t\t`const __getCommand_${name} = createGraphqlStateManagerCommand(${JSON.stringify(name)}, ${JSON.stringify(graphqlCfg)});`,\n\t\t\t`export default ${cfg.factoryName}(__getCommand_${name});`,\n\t\t].join(\"\\n\");\n\t}\n\tconst synthesizedCfg = {\n\t\ttype: \"imperative-read\" as const,\n\t\tinvokerShape: \"legacy\" as const,\n\t\tmcp: { toolName: cfg.mcp?.toolName },\n\t\tconfigJsonSchema: cfg.configJsonSchema,\n\t};\n\treturn [\n\t\t`import { ${cfg.factoryName} } from ${JSON.stringify(cfg.factoryModule)};`,\n\t\t`const __cfg_${name} = ${JSON.stringify(synthesizedCfg)};`,\n\t\t`const __imperativeAdapter_${name} = createReadAdapter(${JSON.stringify(name)}, __cfg_${name});`,\n\t\t`export default ${cfg.factoryName}(__imperativeAdapter_${name});`,\n\t].join(\"\\n\");\n}\n\n/** Maps a config discriminator to the factory name emitted in the virtual module. */\nfunction factoryFor(type: LdsAdapterConfig[\"type\"]): string {\n\tswitch (type) {\n\t\tcase \"wire\":\n\t\t\treturn \"createWireAdapter\";\n\t\tcase \"imperative-mutation\":\n\t\t\treturn \"createMutationAdapter\";\n\t\tcase \"imperative-read\":\n\t\t\treturn \"createReadAdapter\";\n\t\tcase \"graphql-wire\":\n\t\t\treturn \"createGraphQLWireAdapter\";\n\t\tcase \"graphql-mutation\":\n\t\t\treturn \"createGraphQLMutationAdapter\";\n\t\tcase \"graphql-imperative-read\":\n\t\t\treturn \"createGraphQLImperativeReadAdapter\";\n\t\tcase \"state-manager\":\n\t\t\t// Load-hook directive name (consumed in W-05), not a runtime-import\n\t\t\t// factory: the load hook synthesizes an adapter inline and calls\n\t\t\t// the upstream factoryModule/factoryName to compose the state manager.\n\t\t\treturn \"createStateManagerComposition\";\n\t}\n}\n\nfunction parseImportSpecifiers(bracesContent: string): { original: string; full: string }[] {\n\treturn bracesContent\n\t\t.split(\",\")\n\t\t.map((s) => s.trim())\n\t\t.filter(Boolean)\n\t\t.map((entry) => {\n\t\t\tconst asIdx = entry.indexOf(\" as \");\n\t\t\tconst original = asIdx !== -1 ? entry.slice(0, asIdx).trim() : entry.trim();\n\t\t\treturn { original, full: entry };\n\t\t});\n}\n\n/**\n * Deep-merges user overrides onto the default registry: every specifier from\n * both sides is preserved, and per-specifier entries are merged so a consumer\n * can override `getRecord` without losing `createRecord`, or register a new\n * entry on `lightning/graphql` without losing `graphql` / `executeMutation`.\n * Pass an empty object to get just the defaults. To opt out of a default\n * entry, pass the same specifier with a different entry of the same key.\n */\nfunction mergeWithDefaults(overrides: LdsAdapterRegistry): LdsAdapterRegistry {\n\tconst merged: LdsAdapterRegistry = { ...DEFAULT_ADAPTERS };\n\tfor (const [specifier, entries] of Object.entries(overrides)) {\n\t\tmerged[specifier] = { ...(DEFAULT_ADAPTERS[specifier] ?? {}), ...entries };\n\t}\n\treturn merged;\n}\n\n/**\n * LDS provider — rewrites registered `lightning/*` imports (e.g.\n * `lightning/uiRecordApi`) to MCP-tool-backed virtual modules. Unregistered\n * exports pass through to the normal `lightning/*` resolution.\n *\n * Three Vite hooks do the work:\n *\n * - **`transform`** — parses each `.js` / `.ts` file with `es-module-lexer`,\n * finds named imports from registered specifiers, and rewrites them to pull\n * registered names from `sf-lds-adapter:<specifier>` while leaving\n * unregistered names pointing at the original specifier.\n *\n * - **`resolveId`** — maps `sf-lds-adapter:<specifier>` to a `\\0`-prefixed\n * virtual module ID, preventing Rollup from attempting a filesystem lookup.\n *\n * - **`load`** — generates the virtual module, emitting an MCP-backed\n * `createWireAdapter(...)` class for every `type: 'wire'` entry,\n * `createMutationAdapter(...)` for every `type: 'imperative-mutation'` entry,\n * and `createReadAdapter(...)` for every `type: 'imperative-read'` entry.\n *\n * Only specifiers present in the `adapters` registry are intercepted; imports from\n * unregistered specifiers pass through unchanged.\n */\nexport function lds(\n\toverrides: LdsAdapterRegistry = {},\n): Plugin & { passthroughRules: PassthroughRule[] } {\n\tconst adapters = mergeWithDefaults(overrides);\n\t// Graphql specifiers are owned whole by the virtual module — every export\n\t// (adapters + `gql`) lives there, so the transform hook should not split\n\t// their imports. Non-graphql specifiers still go through transform so\n\t// unregistered names pass through to the real `lightning/*` module.\n\tconst graphqlSpecifiers = new Set<string>(\n\t\tObject.entries(adapters)\n\t\t\t.filter(([, moduleAdapters]) => isGraphqlSpecifier(moduleAdapters))\n\t\t\t.map(([specifier]) => specifier),\n\t);\n\t// State-manager specifiers (`lightning/stateManager*`) are also owned\n\t// whole by the virtual module: their load-hook body emits `export default\n\t// <factory>(...)` per §10.4, so the public consumer surface is a default\n\t// import. The transform hook only rewrites brace-style named imports, so\n\t// state-manager specifiers are excluded from `transformSpecifiers` and\n\t// claimed in `resolveId` directly — same pattern as graphql specifiers.\n\tconst stateManagerSpecifiers = new Set<string>(\n\t\tObject.entries(adapters)\n\t\t\t.filter(([, moduleAdapters]) => isStateManagerSpecifier(moduleAdapters))\n\t\t\t.map(([specifier]) => specifier),\n\t);\n\tconst transformSpecifiers = Object.keys(adapters).filter(\n\t\t(s) => !graphqlSpecifiers.has(s) && !stateManagerSpecifiers.has(s),\n\t);\n\tconst specifierSnippets = transformSpecifiers.flatMap((s) => [`'${s}'`, `\"${s}\"`]);\n\n\t// State-manager `factoryModule` specifiers (e.g.\n\t// `@salesforce/state-managers-uiapi/factory`) are imported from inside the\n\t// emitted virtual module and must reach their real npm package — not the\n\t// scoped-providers fallback. The fallback would otherwise claim them via\n\t// any broad `@salesforce/` interceptPrefix derived from co-installed\n\t// providers (i18n / label / gate). Surface them as passthroughRules so the\n\t// main plugin can hand them to scopedProviders, which short-circuits when\n\t// the importer is one of our `sf-lds-adapter:` virtual modules.\n\tconst factoryModuleSpecifiers = new Set<string>();\n\tfor (const moduleAdapters of Object.values(adapters)) {\n\t\tfor (const entry of Object.values(moduleAdapters)) {\n\t\t\tif (entry.type === \"state-manager\") {\n\t\t\t\tfactoryModuleSpecifiers.add(entry.factoryModule);\n\t\t\t}\n\t\t}\n\t}\n\tconst passthroughRules: PassthroughRule[] = [...factoryModuleSpecifiers].map((specifier) => ({\n\t\tspecifierPrefix: specifier,\n\t\timporterPattern: ADAPTER_PREFIX,\n\t}));\n\n\tconst plugin: Plugin = {\n\t\tname: \"vite-plugin-lds\",\n\t\tenforce: \"pre\",\n\n\t\tasync transform(code, id) {\n\t\t\tconst cleanId = id.split(\"?\")[0] ?? id;\n\t\t\tif (!cleanId.endsWith(\".js\") && !cleanId.endsWith(\".ts\")) return null;\n\t\t\tif (cleanId.includes(\"/node_modules/\")) return null;\n\t\t\tif (!specifierSnippets.some((snippet) => code.includes(snippet))) return null;\n\n\t\t\tawait init;\n\n\t\t\tlet imports: ReturnType<typeof parse>[0];\n\t\t\ttry {\n\t\t\t\t[imports] = parse(code);\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst relevant = imports.filter(\n\t\t\t\t(imp) =>\n\t\t\t\t\timp.d === -1 && imp.n !== undefined && imp.n in adapters && !graphqlSpecifiers.has(imp.n),\n\t\t\t);\n\t\t\tif (relevant.length === 0) return null;\n\n\t\t\tconst s = new MagicString(code);\n\t\t\tlet changed = false;\n\n\t\t\tfor (const imp of relevant) {\n\t\t\t\tconst { ss: start, se: end, n: specifier } = imp;\n\t\t\t\tconst statement = code.slice(start, end);\n\n\t\t\t\tconst openBrace = statement.indexOf(\"{\");\n\t\t\t\tconst closeBrace = statement.indexOf(\"}\");\n\t\t\t\tif (openBrace === -1 || closeBrace === -1) continue;\n\n\t\t\t\tconst bracesContent = statement.slice(openBrace + 1, closeBrace);\n\t\t\t\tconst moduleAdapters = adapters[specifier!]!;\n\t\t\t\tconst parsedImport = parseImportSpecifiers(bracesContent);\n\t\t\t\tconst registered = parsedImport.filter((p) => p.original in moduleAdapters);\n\t\t\t\tconst unregistered = parsedImport.filter((p) => !(p.original in moduleAdapters));\n\n\t\t\t\tif (registered.length === 0) continue;\n\n\t\t\t\tconst parts: string[] = [\n\t\t\t\t\t`import { ${registered.map((p) => p.full).join(\", \")} } from '${ADAPTER_PREFIX}${specifier}';`,\n\t\t\t\t];\n\n\t\t\t\tif (unregistered.length > 0) {\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t`import { ${unregistered.map((p) => p.full).join(\", \")} } from '${specifier}';`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\ts.overwrite(start, end, parts.join(\"\\n\"));\n\t\t\t\tchanged = true;\n\t\t\t}\n\n\t\t\tif (!changed) return null;\n\t\t\treturn { code: s.toString(), map: s.generateMap({ hires: true }) };\n\t\t},\n\n\t\tresolveId(id) {\n\t\t\t// Graphql + state-manager specifiers are intercepted raw — no\n\t\t\t// transform hook split — and mapped into the same\n\t\t\t// `\\0sf-lds-adapter:` virtual namespace so the load hook emits one\n\t\t\t// module per specifier. State-manager modules expose `default` as\n\t\t\t// their only public export (§10.4), so default imports of\n\t\t\t// `lightning/stateManager*` need this interception to reach the\n\t\t\t// virtual module body.\n\t\t\tif (graphqlSpecifiers.has(id) || stateManagerSpecifiers.has(id)) {\n\t\t\t\treturn ADAPTER_ID_PREFIX + id;\n\t\t\t}\n\t\t\tif (id.startsWith(ADAPTER_PREFIX)) return ADAPTER_ID_PREFIX + id.slice(ADAPTER_PREFIX.length);\n\t\t\treturn null;\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (!id.startsWith(ADAPTER_ID_PREFIX)) return null;\n\n\t\t\tconst specifier = id.slice(ADAPTER_ID_PREFIX.length);\n\t\t\tconst moduleAdapters = adapters[specifier];\n\t\t\tif (!moduleAdapters) return null;\n\n\t\t\t// create lines of code used to create MCP tool based adapters\n\t\t\tconst lines: string[] = [adapterBaseSource];\n\t\t\tfor (const [name, entry] of Object.entries(moduleAdapters)) {\n\t\t\t\tif (entry.type === \"state-manager\") {\n\t\t\t\t\t// State-manager entries do not call a runtime factory like\n\t\t\t\t\t// the other types. Per spec §8.4 / §10.4, the load hook\n\t\t\t\t\t// emits a small composition block that synthesizes a\n\t\t\t\t\t// legacy-shape imperative adapter inline and feeds it into\n\t\t\t\t\t// the upstream `<factoryName>` from `<factoryModule>`.\n\t\t\t\t\tlines.push(buildStateManagerCompositionBody(name, entry, specifier));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst { type, ...cfg } = entry;\n\t\t\t\tlines.push(\n\t\t\t\t\t`export const ${name} = ${factoryFor(type)}(${JSON.stringify(name)}, ${JSON.stringify(cfg)});`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// `gql` rides along with any specifier that declares a graphql\n\t\t\t// adapter, so `import { gql } from 'lightning/graphql'` (or any\n\t\t\t// aliased form) keeps resolving even when no adapters are\n\t\t\t// imported alongside it. The binding itself is a private function\n\t\t\t// inside `adapterBaseSource` after `stripTopLevelExports`.\n\t\t\tif (graphqlSpecifiers.has(specifier)) {\n\t\t\t\tlines.push(\"export { gql };\");\n\t\t\t}\n\t\t\treturn lines.join(\"\\n\");\n\t\t},\n\t};\n\treturn Object.assign(plugin, { passthroughRules });\n}\n"],"names":[],"mappings":";;;;;AAgBA,MAAM,iBAAiB;AAEvB,MAAM,oBAAoB,OAAO;AAcjC,MAAM,oBAAoB;AAAA,EACzB,aAAa,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,OAAO;AAClF;AAYA,SAAS,qBAAqB,QAAwB;AACrD,SAAO,OACL,QAAQ,2CAA2C,EAAE,EACrD,QAAQ,8BAA8B,EAAE;AAC3C;AAwKA,MAAM,cAAc;AACpB,MAAM,gBAA4B;AAAA,EACjC,MAAM;AAAA,EACN,YAAY;AAAA,IACX,UAAU,EAAE,MAAM,SAAA;AAAA,IAClB,aAAa;AAAA,MACZ,OAAO,CAAC,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAA,EAAS,GAAK,EAAE,MAAM,QAAQ;AAAA,IAAA;AAAA,IAEvE,QAAQ;AAAA,MACP,OAAO,CAAC,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAA,EAAS,GAAK,EAAE,MAAM,QAAQ;AAAA,IAAA;AAAA,EACvE;AAAA,EAED,UAAU,CAAC,UAAU;AAAA,EACrB,sBAAsB;AAAA,EACtB,OAAO;AAAA,IACN;AAAA,MACC,MAAM;AAAA,MACN,YAAY;AAAA,QACX,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,YAAY,UAAU,EAAA;AAAA,MAAE;AAAA,MAEjE,UAAU,CAAC,QAAQ;AAAA,MACnB,sBAAsB;AAAA,IAAA;AAAA,IAEvB;AAAA,MACC,MAAM;AAAA,MACN,YAAY;AAAA,QACX,aAAa;AAAA,UACZ,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAA;AAAA,UACf,UAAU;AAAA,QAAA;AAAA,MACX;AAAA,MAED,UAAU,CAAC,aAAa;AAAA,MACxB,sBAAsB;AAAA,IAAA;AAAA,EACvB;AAEF;AAEA,MAAM,mBAAmB;AACzB,MAAM,qBAAiC;AAAA,EACtC,MAAM;AAAA,EACN,YAAY;AAAA,IACX,eAAe,EAAE,MAAM,SAAA;AAAA,EAAS;AAAA,EAEjC,UAAU,CAAC,eAAe;AAAA,EAC1B,sBAAsB;AACvB;AAEA,MAAM,eAAe;AASrB,MAAM,mBAAuC;AAAA,EAC5C,yBAAyB;AAAA,IACxB,WAAW;AAAA,MACV,MAAM;AAAA,MACN,KAAK,EAAE,UAAU,YAAA;AAAA,MACjB,kBAAkB;AAAA,IAAA;AAAA,IAEnB,cAAc;AAAA,MACb,MAAM;AAAA,MACN,KAAK,EAAE,UAAU,sBAAA;AAAA,MACjB,kBAAkB;AAAA,QACjB,MAAM;AAAA,QACN,YAAY;AAAA,UACX,SAAS,EAAE,MAAM,SAAA;AAAA,UACjB,QAAQ;AAAA,YACP,MAAM;AAAA,YACN,YAAY,CAAA;AAAA,YACZ,UAAU,CAAA;AAAA,YACV,sBAAsB;AAAA,UAAA;AAAA,QACvB;AAAA,QAED,UAAU,CAAC,WAAW,QAAQ;AAAA,QAC9B,sBAAsB;AAAA,MAAA;AAAA,IACvB;AAAA,IAED,cAAc;AAAA,MACb,MAAM;AAAA,MACN,KAAK,EAAE,UAAU,sBAAA;AAAA,MACjB,kBAAkB;AAAA,QACjB,MAAM;AAAA,QACN,YAAY;AAAA,UACX,UAAU,EAAE,MAAM,SAAA;AAAA,UAClB,QAAQ;AAAA,YACP,MAAM;AAAA,YACN,YAAY,CAAA;AAAA,YACZ,UAAU,CAAA;AAAA,YACV,sBAAsB;AAAA,UAAA;AAAA,QACvB;AAAA,QAED,UAAU,CAAC,YAAY,QAAQ;AAAA,QAC/B,sBAAsB;AAAA,MAAA;AAAA,IACvB;AAAA,EACD;AAAA,EAED,6BAA6B;AAAA;AAAA;AAAA;AAAA,IAI5B,0BAA0B;AAAA,MACzB,MAAM;AAAA,MACN,cAAc;AAAA,MACd,KAAK,EAAE,UAAU,iBAAA;AAAA,MACjB,kBAAkB;AAAA,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMD,qBAAqB;AAAA,IACpB,SAAS,EAAE,MAAM,gBAAgB,KAAK,EAAE,UAAU,eAAa;AAAA,IAC/D,iBAAiB,EAAE,MAAM,oBAAoB,KAAK,EAAE,UAAU,eAAa;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqB9E,iCAAiC;AAAA,IAChC,SAAS;AAAA,MACR,MAAM;AAAA,MACN,eAAe;AAAA,MACf,aAAa;AAAA,MACb,KAAK,EAAE,UAAU,aAAA;AAAA,IAAa;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASD,oCAAoC;AAAA,IACnC,SAAS;AAAA,MACR,MAAM;AAAA,MACN,eAAe;AAAA,MACf,aAAa;AAAA,MACb,KAAK,EAAE,UAAU,iBAAA;AAAA,MACjB,kBAAkB;AAAA,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUD,gCAAgC;AAAA,IAC/B,SAAS;AAAA,MACR,MAAM;AAAA,MACN,eAAe;AAAA,MACf,aAAa;AAAA,MACb,KAAK,EAAE,UAAU,YAAA;AAAA,MACjB,kBAAkB;AAAA,IAAA;AAAA,EACnB;AAEF;AAGA,SAAS,mBAAmB,gBAA2D;AACtF,SAAO,OAAO,OAAO,cAAc,EAAE;AAAA,IACpC,CAAC,UACA,MAAM,SAAS,kBACf,MAAM,SAAS,sBACf,MAAM,SAAS;AAAA,EAAA;AAElB;AAGA,SAAS,wBAAwB,gBAA2D;AAC3F,SAAO,OAAO,OAAO,cAAc,EAAE,KAAK,CAAC,UAAU,MAAM,SAAS,eAAe;AACpF;AAoBA,SAAS,+BAA+B,WAA4B;AACnE,SAAO,cAAc;AACtB;AAwCA,SAAS,iCACR,MACA,KACA,WACS;AACT,MAAI,+BAA+B,SAAS,GAAG;AAC9C,UAAM,aAAa,EAAE,KAAK,EAAE,UAAU,IAAI,KAAK,WAAS;AACxD,WAAO;AAAA,MACN,YAAY,IAAI,WAAW,WAAW,KAAK,UAAU,IAAI,aAAa,CAAC;AAAA,MACvE,sBAAsB,IAAI,uCAAuC,KAAK,UAAU,IAAI,CAAC,KAAK,KAAK,UAAU,UAAU,CAAC;AAAA,MACpH,kBAAkB,IAAI,WAAW,iBAAiB,IAAI;AAAA,IAAA,EACrD,KAAK,IAAI;AAAA,EACZ;AACA,QAAM,iBAAiB;AAAA,IACtB,MAAM;AAAA,IACN,cAAc;AAAA,IACd,KAAK,EAAE,UAAU,IAAI,KAAK,SAAA;AAAA,IAC1B,kBAAkB,IAAI;AAAA,EAAA;AAEvB,SAAO;AAAA,IACN,YAAY,IAAI,WAAW,WAAW,KAAK,UAAU,IAAI,aAAa,CAAC;AAAA,IACvE,eAAe,IAAI,MAAM,KAAK,UAAU,cAAc,CAAC;AAAA,IACvD,6BAA6B,IAAI,wBAAwB,KAAK,UAAU,IAAI,CAAC,WAAW,IAAI;AAAA,IAC5F,kBAAkB,IAAI,WAAW,wBAAwB,IAAI;AAAA,EAAA,EAC5D,KAAK,IAAI;AACZ;AAGA,SAAS,WAAW,MAAwC;AAC3D,UAAQ,MAAA;AAAA,IACP,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AAIJ,aAAO;AAAA,EAAA;AAEV;AAEA,SAAS,sBAAsB,eAA6D;AAC3F,SAAO,cACL,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAA,CAAM,EACnB,OAAO,OAAO,EACd,IAAI,CAAC,UAAU;AACf,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAClC,UAAM,WAAW,UAAU,KAAK,MAAM,MAAM,GAAG,KAAK,EAAE,SAAS,MAAM,KAAA;AACrE,WAAO,EAAE,UAAU,MAAM,MAAA;AAAA,EAC1B,CAAC;AACH;AAUA,SAAS,kBAAkB,WAAmD;AAC7E,QAAM,SAA6B,EAAE,GAAG,iBAAA;AACxC,aAAW,CAAC,WAAW,OAAO,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC7D,WAAO,SAAS,IAAI,EAAE,GAAI,iBAAiB,SAAS,KAAK,CAAA,GAAK,GAAG,QAAA;AAAA,EAClE;AACA,SAAO;AACR;AAyBO,SAAS,IACf,YAAgC,IACmB;AACnD,QAAM,WAAW,kBAAkB,SAAS;AAK5C,QAAM,oBAAoB,IAAI;AAAA,IAC7B,OAAO,QAAQ,QAAQ,EACrB,OAAO,CAAC,CAAA,EAAG,cAAc,MAAM,mBAAmB,cAAc,CAAC,EACjE,IAAI,CAAC,CAAC,SAAS,MAAM,SAAS;AAAA,EAAA;AAQjC,QAAM,yBAAyB,IAAI;AAAA,IAClC,OAAO,QAAQ,QAAQ,EACrB,OAAO,CAAC,CAAA,EAAG,cAAc,MAAM,wBAAwB,cAAc,CAAC,EACtE,IAAI,CAAC,CAAC,SAAS,MAAM,SAAS;AAAA,EAAA;AAEjC,QAAM,sBAAsB,OAAO,KAAK,QAAQ,EAAE;AAAA,IACjD,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC;AAAA,EAAA;AAElE,QAAM,oBAAoB,oBAAoB,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC;AAUjF,QAAM,8CAA8B,IAAA;AACpC,aAAW,kBAAkB,OAAO,OAAO,QAAQ,GAAG;AACrD,eAAW,SAAS,OAAO,OAAO,cAAc,GAAG;AAClD,UAAI,MAAM,SAAS,iBAAiB;AACnC,gCAAwB,IAAI,MAAM,aAAa;AAAA,MAChD;AAAA,IACD;AAAA,EACD;AACA,QAAM,mBAAsC,CAAC,GAAG,uBAAuB,EAAE,IAAI,CAAC,eAAe;AAAA,IAC5F,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EAAA,EAChB;AAEF,QAAM,SAAiB;AAAA,IACtB,MAAM;AAAA,IACN,SAAS;AAAA,IAET,MAAM,UAAU,MAAM,IAAI;AACzB,YAAM,UAAU,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AACpC,UAAI,CAAC,QAAQ,SAAS,KAAK,KAAK,CAAC,QAAQ,SAAS,KAAK,EAAG,QAAO;AACjE,UAAI,QAAQ,SAAS,gBAAgB,EAAG,QAAO;AAC/C,UAAI,CAAC,kBAAkB,KAAK,CAAC,YAAY,KAAK,SAAS,OAAO,CAAC,EAAG,QAAO;AAEzE,YAAM;AAEN,UAAI;AACJ,UAAI;AACH,SAAC,OAAO,IAAI,MAAM,IAAI;AAAA,MACvB,QAAQ;AACP,eAAO;AAAA,MACR;AAEA,YAAM,WAAW,QAAQ;AAAA,QACxB,CAAC,QACA,IAAI,MAAM,MAAM,IAAI,MAAM,UAAa,IAAI,KAAK,YAAY,CAAC,kBAAkB,IAAI,IAAI,CAAC;AAAA,MAAA;AAE1F,UAAI,SAAS,WAAW,EAAG,QAAO;AAElC,YAAM,IAAI,IAAI,YAAY,IAAI;AAC9B,UAAI,UAAU;AAEd,iBAAW,OAAO,UAAU;AAC3B,cAAM,EAAE,IAAI,OAAO,IAAI,KAAK,GAAG,cAAc;AAC7C,cAAM,YAAY,KAAK,MAAM,OAAO,GAAG;AAEvC,cAAM,YAAY,UAAU,QAAQ,GAAG;AACvC,cAAM,aAAa,UAAU,QAAQ,GAAG;AACxC,YAAI,cAAc,MAAM,eAAe,GAAI;AAE3C,cAAM,gBAAgB,UAAU,MAAM,YAAY,GAAG,UAAU;AAC/D,cAAM,iBAAiB,SAAS,SAAU;AAC1C,cAAM,eAAe,sBAAsB,aAAa;AACxD,cAAM,aAAa,aAAa,OAAO,CAAC,MAAM,EAAE,YAAY,cAAc;AAC1E,cAAM,eAAe,aAAa,OAAO,CAAC,MAAM,EAAE,EAAE,YAAY,eAAe;AAE/E,YAAI,WAAW,WAAW,EAAG;AAE7B,cAAM,QAAkB;AAAA,UACvB,YAAY,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,YAAY,cAAc,GAAG,SAAS;AAAA,QAAA;AAG3F,YAAI,aAAa,SAAS,GAAG;AAC5B,gBAAM;AAAA,YACL,YAAY,aAAa,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,YAAY,SAAS;AAAA,UAAA;AAAA,QAE7E;AAEA,UAAE,UAAU,OAAO,KAAK,MAAM,KAAK,IAAI,CAAC;AACxC,kBAAU;AAAA,MACX;AAEA,UAAI,CAAC,QAAS,QAAO;AACrB,aAAO,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,YAAY,EAAE,OAAO,KAAA,CAAM,EAAA;AAAA,IAChE;AAAA,IAEA,UAAU,IAAI;AAQb,UAAI,kBAAkB,IAAI,EAAE,KAAK,uBAAuB,IAAI,EAAE,GAAG;AAChE,eAAO,oBAAoB;AAAA,MAC5B;AACA,UAAI,GAAG,WAAW,cAAc,UAAU,oBAAoB,GAAG,MAAM,eAAe,MAAM;AAC5F,aAAO;AAAA,IACR;AAAA,IAEA,KAAK,IAAI;AACR,UAAI,CAAC,GAAG,WAAW,iBAAiB,EAAG,QAAO;AAE9C,YAAM,YAAY,GAAG,MAAM,kBAAkB,MAAM;AACnD,YAAM,iBAAiB,SAAS,SAAS;AACzC,UAAI,CAAC,eAAgB,QAAO;AAG5B,YAAM,QAAkB,CAAC,iBAAiB;AAC1C,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AAC3D,YAAI,MAAM,SAAS,iBAAiB;AAMnC,gBAAM,KAAK,iCAAiC,MAAM,OAAO,SAAS,CAAC;AACnE;AAAA,QACD;AACA,cAAM,EAAE,MAAM,GAAG,IAAA,IAAQ;AACzB,cAAM;AAAA,UACL,gBAAgB,IAAI,MAAM,WAAW,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,QAAA;AAAA,MAE5F;AAMA,UAAI,kBAAkB,IAAI,SAAS,GAAG;AACrC,cAAM,KAAK,iBAAiB;AAAA,MAC7B;AACA,aAAO,MAAM,KAAK,IAAI;AAAA,IACvB;AAAA,EAAA;AAED,SAAO,OAAO,OAAO,QAAQ,EAAE,kBAAkB;AAClD;"}
@@ -1,6 +1,6 @@
1
1
  import { buildDefaultImperativeBindingsServiceDescriptor, buildQueryImperativeBindingsServiceDescriptor, buildSubscribableImperativeBindingsServiceDescriptor, buildLegacyImperativeBindingsServiceDescriptor } from "@conduit-client/service-bindings-imperative/v1";
2
2
  import { buildLWCWireBindingsServiceDescriptor } from "@conduit-client/service-bindings-lwc/v1";
3
- import { err, ok, toError, buildSubscribableResult } from "@conduit-client/utils";
3
+ import { ok, UserVisibleError, err, buildSubscribableResult, toError } from "@conduit-client/utils";
4
4
  import { getChatSDK } from "@salesforce/platform-sdk";
5
5
  function normalizeMcpResponse(raw) {
6
6
  if (raw && typeof raw === "object" && "structuredContent" in raw) {
@@ -110,6 +110,30 @@ class McpToolSubscribableCommand {
110
110
  return buildSubscribableResult(result, subscribe, refresh);
111
111
  }
112
112
  }
113
+ function createGraphqlStateManagerCommand(name, cfg) {
114
+ const toolName = resolveMcpToolName(name, cfg);
115
+ return (config) => ({
116
+ async execute() {
117
+ const base = new McpToolSubscribableCommand(name, toolName, {
118
+ query: config.query,
119
+ variables: config.variables ?? {},
120
+ ...config.operationName !== void 0 && { operationName: config.operationName }
121
+ });
122
+ const subscribable = await base.execute();
123
+ if (subscribable.isOk()) {
124
+ return ok(subscribable.value);
125
+ }
126
+ const innerError = subscribable.error.failure;
127
+ const message = innerError.message;
128
+ const userVisible = new UserVisibleError({
129
+ data: void 0,
130
+ errors: [{ message }]
131
+ });
132
+ userVisible.message = message;
133
+ return err({ ...subscribable.error, failure: userVisible });
134
+ }
135
+ });
136
+ }
113
137
  const defaultImperativeService = buildDefaultImperativeBindingsServiceDescriptor().service;
114
138
  const queryImperativeService = buildQueryImperativeBindingsServiceDescriptor().service;
115
139
  const subscribableImperativeService = buildSubscribableImperativeBindingsServiceDescriptor().service;
@@ -189,12 +213,16 @@ function gql(strings, ...values) {
189
213
  return result.trim();
190
214
  }
191
215
  async function runGraphqlQuery(adapterName, toolName, config) {
192
- const { query, variables } = config;
216
+ const { query, variables, operationName } = config;
193
217
  if (!query) return { data: void 0, errors: void 0 };
194
218
  const callTool = await getCallTool(adapterName);
195
219
  const raw = await callTool({
196
220
  toolName,
197
- params: { query, variables: variables ?? {} }
221
+ params: {
222
+ query,
223
+ variables: variables ?? {},
224
+ ...operationName !== void 0 && { operationName }
225
+ }
198
226
  });
199
227
  return normalizeMcpResponse(raw) ?? {};
200
228
  }
@@ -235,7 +263,7 @@ function createGraphQLWireAdapter(name, cfg) {
235
263
  return this._fetch();
236
264
  }
237
265
  async _fetch() {
238
- this._emit(await runGraphqlQuerySafe(name, toolName, this._config ?? {}));
266
+ this._emit(await runGraphqlQuerySafe(name, toolName, this._config ?? { query: "" }));
239
267
  }
240
268
  _emit({ data, errors }) {
241
269
  this._dataCallback({
@@ -320,6 +348,7 @@ export {
320
348
  createGraphQLImperativeReadAdapter,
321
349
  createGraphQLMutationAdapter,
322
350
  createGraphQLWireAdapter,
351
+ createGraphqlStateManagerCommand,
323
352
  createMutationAdapter,
324
353
  createReadAdapter,
325
354
  createWireAdapter,
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sources":["../../../src/providers/shared/normalize-mcp-response.ts","../../../src/providers/lds/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 type { ResultCommand, SubscribableResultCommand } from \"@conduit-client/bindings-utils/v1\";\nimport type { assertIsValid, JSONSchema } from \"@conduit-client/jsonschema-validate\";\nimport {\n\tbuildDefaultImperativeBindingsServiceDescriptor,\n\tbuildLegacyImperativeBindingsServiceDescriptor,\n\tbuildQueryImperativeBindingsServiceDescriptor,\n\tbuildSubscribableImperativeBindingsServiceDescriptor,\n} from \"@conduit-client/service-bindings-imperative/v1\";\nimport { buildLWCWireBindingsServiceDescriptor } from \"@conduit-client/service-bindings-lwc/v1\";\nimport {\n\tbuildSubscribableResult,\n\terr,\n\tok,\n\ttoError,\n\ttype Callback,\n\ttype Result,\n\ttype Unsubscribe,\n} from \"@conduit-client/utils\";\nimport { getChatSDK } from \"@salesforce/platform-sdk\";\nimport type { ReadInvokerShape } from \"./types\";\nimport { normalizeMcpResponse } from \"../shared/normalize-mcp-response\";\n\n/**\n * Runtime mirror of the public `LdsAdapterConfigBase` — adapters dispatch\n * through `cfg.mcp?.toolName`. Kept nominal-free so the virtual module can\n * cheaply deserialize the JSON-stringified config written by the load hook.\n */\ninterface McpBackedAdapterConfig {\n\tmcp?: { toolName: string };\n}\n\n/**\n * LDS adapter configs whose input is validated against a JSON Schema at\n * invoke time. Wire, mutation, and read factories all consume this shape;\n * graphql factories skip the schema layer entirely.\n */\ninterface SchemaValidatedAdapterConfig extends McpBackedAdapterConfig {\n\tconfigJsonSchema: JSONSchema;\n}\n\ntype WireAdapterConfig = SchemaValidatedAdapterConfig;\n\ntype MutationAdapterConfig = SchemaValidatedAdapterConfig;\n\ninterface ReadAdapterConfig extends SchemaValidatedAdapterConfig {\n\tinvokerShape: ReadInvokerShape;\n}\n\n/**\n * Resolves the MCP tool name for an adapter config, or throws if none of the\n * supported backings are set. Today only `mcp` is wired up; future backings\n * (e.g. `http`) will be resolved in the same choke point.\n */\nfunction resolveMcpToolName(adapterName: string, cfg: McpBackedAdapterConfig): string {\n\tconst toolName = cfg.mcp?.toolName;\n\tif (!toolName) {\n\t\tthrow new Error(`[${adapterName}] no dispatch backing configured — expected \\`mcp.toolName\\`.`);\n\t}\n\treturn toolName;\n}\n\n/**\n * Optional envelope splitter. Converts the normalized MCP payload into a\n * `Result<Data, Error>` — used by the wire adapter so tools that return\n * `{ data, error }` land on OneStore's Err branch when `error` is set.\n * Imperative callers leave this unset and get the raw payload wrapped in\n * `ok(...)`.\n */\ntype UnwrapEnvelope<Data> = (payload: unknown) => Result<Data, Error>;\n\n/**\n * Resolves the MCP chat SDK and returns its `callTool` function, or throws a\n * consistent \"[adapter] sdk.callTool is not available\" error. Shared by the\n * LDS `McpToolCommand` and the graphql `runGraphqlQuery` — the check and\n * message are identical on both paths.\n */\nasync function getCallTool(\n\tadapterName: string,\n): Promise<(args: { toolName: string; params?: Record<string, unknown> }) => Promise<unknown>> {\n\tconst sdk = await getChatSDK();\n\tif (typeof sdk.callTool !== \"function\") {\n\t\tthrow new Error(\n\t\t\t`[${adapterName}] sdk.callTool is not available on this surface. ` +\n\t\t\t\t\"Make sure window.openai is configured or the component is running \" +\n\t\t\t\t\"in an MCP Apps / OpenAI chat context.\",\n\t\t);\n\t}\n\treturn sdk.callTool.bind(sdk);\n}\n\n/**\n * Pulls a human-readable message out of an MCP error response\n * (`{ isError: true, content: [{ type: 'text', text: ... }, ...] }`).\n * Returns an empty string if no text content is present so the caller can\n * supply a fallback.\n */\nfunction extractToolErrorText(raw: unknown): string {\n\tconst content = (raw as { content?: unknown }).content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.map((c) => {\n\t\t\tif (c && typeof c === \"object\" && (c as { type?: string }).type === \"text\") {\n\t\t\t\treturn (c as { text?: string }).text ?? \"\";\n\t\t\t}\n\t\t\treturn \"\";\n\t\t})\n\t\t.join(\" \")\n\t\t.trim();\n}\n\n/**\n * `Command` implementation that calls the configured MCP tool. One class,\n * reused across imperative and wire adapters.\n *\n * `execute()` returns a `Result<Data, unknown>`:\n * - `ok(data)` when the tool resolves — `data` is the unwrapped payload from\n * `normalizeMcpResponse` (or the result of the optional `unwrap` hook).\n * - `err(error)` when the tool rejects, when `sdk.callTool` is unavailable,\n * or when the `unwrap` hook returns `err(...)`.\n *\n * OneStore's `DefaultImperativeBindingsService` wraps this: on `ok(v)` it\n * deep-freezes and returns `v`; on `err(e)` it re-throws via `toError`. Sync\n * throws from `assertIsValid` in the `getCommand` factory are funneled through\n * `throwUserlandError`. `LWCWireBindingsService` wraps the same command\n * differently — it emits `{ data, error }` to the wire callback and attaches\n * freeze / race-guard / incomplete-config behavior.\n */\nclass McpToolCommand<Data> implements ResultCommand<Data, Error> {\n\tconstructor(\n\t\tprivate readonly adapterName: string,\n\t\tprivate readonly toolName: string,\n\t\tprivate readonly params: unknown,\n\t\tprivate readonly unwrap?: UnwrapEnvelope<Data>,\n\t) {}\n\n\tasync execute(): Promise<Result<Data, Error>> {\n\t\ttry {\n\t\t\tconst callTool = await getCallTool(this.adapterName);\n\t\t\tconst raw = await callTool({\n\t\t\t\ttoolName: this.toolName,\n\t\t\t\tparams: (this.params as Record<string, unknown>) ?? undefined,\n\t\t\t});\n\t\t\t// The MCP SDK converts handler throws into a resolved tool response\n\t\t\t// with `{ isError: true, content: [...] }` — not a transport\n\t\t\t// rejection. Surface it as an Err here so the default invoker\n\t\t\t// re-throws and the wire/legacy adapters route it through their\n\t\t\t// error channel.\n\t\t\tif (raw && typeof raw === \"object\" && (raw as { isError?: boolean }).isError) {\n\t\t\t\treturn err(new Error(extractToolErrorText(raw) || \"MCP tool error\"));\n\t\t\t}\n\t\t\tconst payload = normalizeMcpResponse(raw);\n\t\t\treturn this.unwrap ? this.unwrap(payload) : ok(payload as Data);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e : new Error(String(e)));\n\t\t}\n\t}\n}\n\n// Off-platform has no store to observe. For shapes that have no `refresh`,\n// nothing can ever trigger a post-initial update, so `subscribe` is a\n// deliberate no-op: the callback never fires and the returned unsubscribe is\n// idempotent. Shapes that *do* expose `refresh` wire subscribers into the\n// refresh path instead (see `McpToolSubscribableCommand` and the\n// `query-refreshable` graphql shape).\nconst noopUnsubscribe: Unsubscribe = () => {\n\t// no store to unsubscribe from off-platform\n};\nconst noopSubscribe = (_cb: unknown): Unsubscribe => noopUnsubscribe;\n\n/**\n * Adapts `McpToolCommand` into a `SubscribableResultCommand`. Wraps the\n * command's `Result` with `buildSubscribableResult`, supplying:\n * - `subscribe`: per-execution subscriber set. Each `execute()` call has\n * its own set so sibling invocations don't cross-pollinate. Returned\n * unsubscribe removes the callback and is idempotent.\n * - `refresh`: builds a fresh `McpToolCommand`, re-executes it, and\n * broadcasts the fresh `Result` to every registered subscriber before\n * resolving. Returns `Result<void, Error>` (ok → undefined; err → the\n * error from the fresh execute).\n *\n * Wiring subscribers into refresh mirrors on-platform behavior, where the\n * reactive store fans `refresh` results out to every listener. Off-platform\n * there is no store, so the subscriber set lives on the command itself. This\n * shim is what lets OneStore's Subscribable and Legacy services run verbatim\n * against MCP: their invokers gate on `isSubscribableResult`, which requires\n * the command's `execute()` to resolve a `SubscribableResult` (not a plain\n * `Result`).\n */\nclass McpToolSubscribableCommand<Data> implements SubscribableResultCommand<Data, Error> {\n\tconstructor(\n\t\tprivate readonly adapterName: string,\n\t\tprivate readonly toolName: string,\n\t\tprivate readonly params: unknown,\n\t\tprivate readonly unwrap?: UnwrapEnvelope<Data>,\n\t) {}\n\n\tasync execute() {\n\t\tconst base = new McpToolCommand<Data>(\n\t\t\tthis.adapterName,\n\t\t\tthis.toolName,\n\t\t\tthis.params,\n\t\t\tthis.unwrap,\n\t\t);\n\t\tconst result = await base.execute();\n\t\tconst subscribers = new Set<Callback<Result<Data, Error>>>();\n\t\tconst subscribe = (cb: Callback<Result<Data, Error>>): Unsubscribe => {\n\t\t\tsubscribers.add(cb);\n\t\t\treturn () => {\n\t\t\t\tsubscribers.delete(cb);\n\t\t\t};\n\t\t};\n\t\tconst refresh = async () => {\n\t\t\tconst next = await new McpToolCommand<Data>(\n\t\t\t\tthis.adapterName,\n\t\t\t\tthis.toolName,\n\t\t\t\tthis.params,\n\t\t\t\tthis.unwrap,\n\t\t\t).execute();\n\t\t\tsubscribers.forEach((cb) => cb(next));\n\t\t\treturn next.isOk() ? ok<void, Error>(undefined) : err(next.error);\n\t\t};\n\t\treturn buildSubscribableResult(result, subscribe, refresh);\n\t}\n}\n\nconst defaultImperativeService = buildDefaultImperativeBindingsServiceDescriptor().service;\nconst queryImperativeService = buildQueryImperativeBindingsServiceDescriptor().service;\nconst subscribableImperativeService =\n\tbuildSubscribableImperativeBindingsServiceDescriptor().service;\nconst legacyImperativeService = buildLegacyImperativeBindingsServiceDescriptor().service;\n\n/**\n * Mutation-shape factory. Builds an async `(config) => Promise<Data>` via\n * OneStore's `DefaultImperativeBindingsService`. Throws on validation error\n * (`throwUserlandError`) or tool error (`toError`). This is the only shape a\n * mutation ever takes on platform — mutation adapters do not carry an\n * `invokerShape` at all.\n */\nexport function createMutationAdapter(name: string, cfg: MutationAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tconst getCommand = (options: { params: unknown[]; assertIsValid: typeof assertIsValid }) => {\n\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\treturn new McpToolCommand<unknown>(name, toolName, options.params[0]);\n\t};\n\tconst invoker = defaultImperativeService.bind<unknown[], unknown>(getCommand);\n\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n}\n\n/**\n * Read-shape factory. Dispatches on `cfg.invokerShape`:\n *\n * - `legacy` — `{ invoke, subscribe }` callback surface with `{ data, error }`.\n * `subscribe` fires the callback once from the initial execute's `data`,\n * returns a no-op unsubscribe, and never fires again off-platform.\n * - `query` — `(config) => Promise<{ data }>`; one-shot read.\n * - `subscribable` — `(config) => Promise<{ data, subscribe }>`. Callback\n * passed to `subscribe` never fires; unsubscribe is a no-op.\n * - `subscribable-refreshable` — `(config) => Promise<{ data, subscribe, refresh }>`.\n * `refresh()` re-executes the MCP tool; `subscribe` is still a no-op.\n *\n * All four delegate to an OneStore service (Query / Subscribable / Legacy)\n * over `McpToolSubscribableCommand`, which preserves OneStore's deep-freeze\n * and error-funnel semantics end-to-end.\n */\nexport function createReadAdapter(name: string, cfg: ReadAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tconst getSubscribableCommand = (options: {\n\t\tparams: unknown[];\n\t\tassertIsValid: typeof assertIsValid;\n\t}) => {\n\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\treturn new McpToolSubscribableCommand<unknown>(name, toolName, options.params[0]);\n\t};\n\n\tswitch (cfg.invokerShape) {\n\t\tcase \"query\": {\n\t\t\tconst getCommand = (options: { params: unknown[]; assertIsValid: typeof assertIsValid }) => {\n\t\t\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\t\t\treturn new McpToolCommand<unknown>(name, toolName, options.params[0]);\n\t\t\t};\n\t\t\tconst invoker = queryImperativeService.bind<unknown[], unknown>(getCommand);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"subscribable\": {\n\t\t\tconst invoker = subscribableImperativeService.bind<unknown[], unknown>(\n\t\t\t\tgetSubscribableCommand,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"subscribable-refreshable\": {\n\t\t\tconst invoker = subscribableImperativeService.bind<unknown[], unknown>(\n\t\t\t\tgetSubscribableCommand,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"legacy\": {\n\t\t\t// Legacy service passes `{ config, assertIsValid }`, not `{ params, ... }`.\n\t\t\tconst getLegacyCommand = (options: {\n\t\t\t\tconfig: unknown;\n\t\t\t\tassertIsValid: typeof assertIsValid;\n\t\t\t}) => {\n\t\t\t\toptions.assertIsValid(options.config, cfg.configJsonSchema);\n\t\t\t\treturn new McpToolSubscribableCommand<unknown>(name, toolName, options.config);\n\t\t\t};\n\t\t\treturn legacyImperativeService.bind<unknown, unknown>(getLegacyCommand);\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(\n\t\t\t\t`[${name}] unsupported invokerShape: ${String((cfg as { invokerShape: unknown }).invokerShape)}. ` +\n\t\t\t\t\t`Expected 'legacy' | 'query' | 'subscribable' | 'subscribable-refreshable'.`,\n\t\t\t);\n\t}\n}\n\nconst lwcWireBindingsService = buildLWCWireBindingsServiceDescriptor().service;\n\n/**\n * Splits the MCP tool's `{ data, error }` envelope into a `Result`. Used as\n * the `unwrap` hook on `McpToolCommand` so OneStore's wire invoker sees the\n * error branch directly instead of receiving an envelope wrapped in `ok(...)`.\n *\n * Tools that don't emit the envelope (e.g. imperative) never go through this\n * path — the default imperative invoker doesn't pass `unwrap`.\n */\nfunction unwrapWireEnvelope<Data>(payload: unknown): Result<Data, Error> {\n\tconst envelope = payload as { data?: unknown; error?: unknown } | null | undefined;\n\tif (envelope && envelope.error !== undefined && envelope.error !== null) {\n\t\treturn err(toError(envelope.error));\n\t}\n\treturn ok(envelope?.data as Data);\n}\n\n/**\n * Creates an LWC wire adapter class that calls an MCP tool. Delegates to\n * OneStore's `LWCWireBindingsService`, so the returned class inherits the\n * full `CommandWireAdapterConstructor` contract: initial empty emit, config\n * `sanitize()`, `MissingRequiredPropertyError` → wait-for-next-config gating,\n * deep-freeze on success, race guard on stale resolves, and unsubscriber\n * management on disconnect.\n *\n * The `McpToolCommand` class is reused verbatim — the wire call-site only\n * supplies an `unwrap` hook so the tool's `{ data, error }` envelope lands\n * on OneStore's Err branch rather than being leaked through as an `ok(...)`\n * envelope.\n *\n * @param name - Wire adapter export name, used in MCP error messages.\n * @param cfg - MCP tool name and JSON Schema for valid wire configs.\n */\nexport function createWireAdapter(name: string, cfg: WireAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn lwcWireBindingsService.bind<unknown>(\n\t\t(config) => new McpToolCommand(name, toolName, config, unwrapWireEnvelope),\n\t\tcfg.configJsonSchema,\n\t);\n}\n\n// ─── GraphQL adapters ─────────────────────────────────────────────────────────\n\n/**\n * GraphQL adapters diverge from the base wire / mutation shapes in two ways:\n *\n * 1. Envelope is `{ data, errors[] }` instead of `{ data, error }`. Errors\n * are collected; an empty array collapses to `undefined`.\n * 2. The `_fetch` path routes thrown errors **into** the `errors[]`\n * envelope on the wire callback (never throws to the LWC host). Mutation\n * likewise resolves with `{ data, errors }` rather than rejecting.\n *\n * Dispatch is MCP-only: `getChatSDK().callTool({ toolName, params })` with\n * `normalizeMcpResponse` unwrapping. No `globalThis.__sfdc_sdk__` shortcut —\n * the on-platform behaviour is already covered by real `lightning/graphql`,\n * and every off-platform caller routes through an MCP tool like every other\n * LDS adapter.\n */\ntype GraphqlAdapterConfig = McpBackedAdapterConfig;\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 GraphqlWireCallback = (result: {\n\tdata: unknown;\n\terrors: { message: string }[] | undefined;\n\trefresh: () => Promise<void>;\n}) => void;\n\n/**\n * Template-literal tag that stitches the string into a plain `query` string.\n * Deliberately minimal — no AST parsing, no fragment substitution, no opaque\n * doc emulation. Matches the shape used by today's off-platform `gql`.\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.trim();\n}\n\nasync function runGraphqlQuery(\n\tadapterName: string,\n\ttoolName: string,\n\tconfig: GraphqlConfig,\n): Promise<GraphqlResult> {\n\tconst { query, variables } = config;\n\tif (!query) return { data: undefined, errors: undefined };\n\n\tconst callTool = await getCallTool(adapterName);\n\tconst raw = await callTool({\n\t\ttoolName,\n\t\tparams: { query, variables: variables ?? {} },\n\t});\n\n\treturn (normalizeMcpResponse(raw) as GraphqlResult) ?? {};\n}\n\n/** Wraps a thrown Error into the graphql `{ data, errors[] }` envelope. */\nfunction toGraphqlErrorResult(error: unknown): GraphqlResult {\n\treturn { data: undefined, errors: [{ message: (error as Error).message }] };\n}\n\n/**\n * `runGraphqlQuery` wrapped in try/catch so thrown errors land on `errors[]`\n * instead of rejecting. Used by every graphql shape that routes errors\n * in-band (wire, mutation, imperative-read query/query-refreshable, legacy).\n */\nasync function runGraphqlQuerySafe(\n\tadapterName: string,\n\ttoolName: string,\n\tconfig: GraphqlConfig,\n): Promise<GraphqlResult> {\n\ttry {\n\t\treturn await runGraphqlQuery(adapterName, toolName, config);\n\t} catch (error) {\n\t\treturn toGraphqlErrorResult(error);\n\t}\n}\n\n/**\n * GraphQL wire adapter factory. Emits `{ data, errors, refresh }` to the wire\n * callback. Mirrors the `constructor(callback)` → `connect` / `disconnect` /\n * `update(config)` / `refresh()` contract used by the LWC wire service.\n * Thrown fetch errors are routed into `errors[0].message`.\n *\n * `_fetch` is gated on `_connected` so that the common wire lifecycle\n * (`constructor` → `update(config)` → `connect`) doesn't fire two requests:\n * the initial `update(config)` arrives before `connect()`, stores the config,\n * and waits. `connect()` does the one fetch; later `update(config)` while\n * connected re-fetches. This matches luvio's `LWCLuvioWireAdapter`, which\n * gates on the same flag to prevent duplicate endpoint calls.\n */\nexport function createGraphQLWireAdapter(name: string, cfg: GraphqlAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn class {\n\t\t_dataCallback: GraphqlWireCallback;\n\t\t_config: GraphqlConfig | undefined;\n\t\t_connected = false;\n\n\t\tconstructor(dataCallback: GraphqlWireCallback) {\n\t\t\tthis._dataCallback = dataCallback;\n\t\t}\n\n\t\tconnect() {\n\t\t\tthis._connected = true;\n\t\t\tvoid this._fetch();\n\t\t}\n\n\t\tdisconnect() {\n\t\t\tthis._connected = false;\n\t\t}\n\n\t\tupdate(config: GraphqlConfig | undefined) {\n\t\t\tthis._config = config;\n\n\t\t\tif (!this._connected || this._config === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid this._fetch();\n\t\t}\n\n\t\trefresh() {\n\t\t\treturn this._fetch();\n\t\t}\n\n\t\tasync _fetch() {\n\t\t\tthis._emit(await runGraphqlQuerySafe(name, toolName, this._config ?? {}));\n\t\t}\n\n\t\t_emit({ data, errors }: GraphqlResult) {\n\t\t\tthis._dataCallback({\n\t\t\t\tdata,\n\t\t\t\terrors: errors?.length ? errors : undefined,\n\t\t\t\trefresh: () => this.refresh(),\n\t\t\t});\n\t\t}\n\t};\n}\n\n/**\n * GraphQL mutation factory. Returns `async (config) => Promise<{ data, errors }>`.\n * Empty-query guard short-circuits with\n * `{ data: undefined, errors: [{ message: \"No query provided\" }] }`.\n * All other errors are routed in-band to the `errors[]` envelope — the\n * function never rejects.\n */\nexport function createGraphQLMutationAdapter(name: string, cfg: GraphqlAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn async (config: GraphqlConfig): Promise<GraphqlResult> => {\n\t\tif (!config?.query) return { data: undefined, errors: [{ message: \"No query provided\" }] };\n\t\treturn runGraphqlQuerySafe(name, toolName, config);\n\t};\n}\n\ntype GraphqlImperativeReadInvokerShape = \"query\" | \"query-refreshable\" | \"legacy\";\n\ninterface GraphqlImperativeReadAdapterConfig extends GraphqlAdapterConfig {\n\tinvokerShape: GraphqlImperativeReadInvokerShape;\n}\n\ntype GraphqlImperativeResult = GraphqlResult & {\n\tsubscribe?: (cb: (result: GraphqlResult) => void) => Unsubscribe;\n\trefresh?: () => Promise<void>;\n};\n\ntype LegacyGraphqlCallback = (result: GraphqlResult) => void;\n\n/**\n * Imperative GraphQL read factory — single entry point for all imperative\n * graphql read shapes, mirroring the LDS `createReadAdapter` pattern. The\n * `invokerShape` selects the return surface:\n *\n * - `query` — `async (config) => Promise<{ data, errors, subscribe }>`.\n * Mirrors on-platform `GraphQLImperativeBindingsService` without\n * `exposeRefresh`. Errors are routed in-band; the function never throws.\n * - `query-refreshable` — same as `query` plus `refresh()` that re-runs the\n * underlying MCP tool. Mirrors the same service with `exposeRefresh: true`.\n * - `legacy` — `{ invoke(config, context, callback),\n * subscribe(config, context, callback): Unsubscribe }`. The callback\n * always receives `{ data, errors }`; neither method throws. `context` is\n * accepted but ignored.\n *\n * In every shape `subscribe` is a deliberate no-op off-platform (no reactive\n * store); returned unsubscribes are idempotent.\n */\nexport function createGraphQLImperativeReadAdapter(\n\tname: string,\n\tcfg: GraphqlImperativeReadAdapterConfig,\n) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tif (cfg.invokerShape === \"legacy\") {\n\t\tasync function run(\n\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\tcallback: LegacyGraphqlCallback,\n\t\t): Promise<void> {\n\t\t\tif (!config?.query) {\n\t\t\t\tcallback({ data: undefined, errors: undefined });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\tcallback({\n\t\t\t\tdata: result.data,\n\t\t\t\terrors: result.errors?.length ? result.errors : undefined,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tinvoke(\n\t\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\t\t_context: unknown,\n\t\t\t\tcallback: LegacyGraphqlCallback,\n\t\t\t): void {\n\t\t\t\tvoid run(config, callback);\n\t\t\t},\n\t\t\tsubscribe(\n\t\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\t\t_context: unknown,\n\t\t\t\tcallback: LegacyGraphqlCallback,\n\t\t\t): Unsubscribe {\n\t\t\t\tvoid run(config, callback);\n\t\t\t\treturn noopUnsubscribe;\n\t\t\t},\n\t\t};\n\t}\n\n\tif (cfg.invokerShape === \"query-refreshable\") {\n\t\t// Per-invocation subscriber set: each call to the returned function\n\t\t// gets its own adapter instance with an isolated subscriber list.\n\t\t// `refresh()` re-runs the MCP tool and broadcasts the fresh\n\t\t// `{ data, errors }` to every registered callback, which mirrors the\n\t\t// on-platform contract where `refresh` causes store updates that fan\n\t\t// out through the `subscribe` fan-in. Without this wiring, `refresh`\n\t\t// would re-run the query off-platform but nothing could observe the\n\t\t// new payload (no store, noop subscribe).\n\t\treturn async (config: GraphqlConfig): Promise<GraphqlImperativeResult> => {\n\t\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\tif (result.errors?.length) {\n\t\t\t\treturn { data: undefined, errors: result.errors };\n\t\t\t}\n\t\t\tconst subscribers = new Set<(result: GraphqlResult) => void>();\n\t\t\treturn {\n\t\t\t\tdata: result.data,\n\t\t\t\terrors: undefined,\n\t\t\t\tsubscribe: (cb) => {\n\t\t\t\t\tsubscribers.add(cb);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tsubscribers.delete(cb);\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\trefresh: async () => {\n\t\t\t\t\tconst fresh = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\t\t\tconst payload: GraphqlResult = {\n\t\t\t\t\t\tdata: fresh.data,\n\t\t\t\t\t\terrors: fresh.errors?.length ? fresh.errors : undefined,\n\t\t\t\t\t};\n\t\t\t\t\tsubscribers.forEach((cb) => cb(payload));\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\t// `query` shape: no refresh → nothing can trigger a post-initial update\n\t// off-platform, so `subscribe` stays a noop. The on-platform contract\n\t// allows subscribe callbacks to fire from unrelated store writes; off-\n\t// platform there is no store, so the callback is correctly unreachable.\n\treturn async (config: GraphqlConfig): Promise<GraphqlImperativeResult> => {\n\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\tif (result.errors?.length) {\n\t\t\treturn { data: undefined, errors: result.errors };\n\t\t}\n\t\treturn {\n\t\t\tdata: result.data,\n\t\t\terrors: undefined,\n\t\t\tsubscribe: noopSubscribe,\n\t\t};\n\t};\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sources":["../../../src/providers/shared/normalize-mcp-response.ts","../../../src/providers/lds/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 type { ResultCommand, SubscribableResultCommand } from \"@conduit-client/bindings-utils/v1\";\nimport type { assertIsValid, JSONSchema } from \"@conduit-client/jsonschema-validate\";\nimport {\n\tbuildDefaultImperativeBindingsServiceDescriptor,\n\tbuildLegacyImperativeBindingsServiceDescriptor,\n\tbuildQueryImperativeBindingsServiceDescriptor,\n\tbuildSubscribableImperativeBindingsServiceDescriptor,\n} from \"@conduit-client/service-bindings-imperative/v1\";\nimport { buildLWCWireBindingsServiceDescriptor } from \"@conduit-client/service-bindings-lwc/v1\";\nimport {\n\tbuildSubscribableResult,\n\terr,\n\tok,\n\ttoError,\n\tUserVisibleError,\n\ttype Callback,\n\ttype Result,\n\ttype Unsubscribe,\n} from \"@conduit-client/utils\";\nimport { getChatSDK } from \"@salesforce/platform-sdk\";\nimport type { ReadInvokerShape } from \"./types\";\nimport { normalizeMcpResponse } from \"../shared/normalize-mcp-response\";\n\n/**\n * Runtime mirror of the public `LdsAdapterConfigBase` — adapters dispatch\n * through `cfg.mcp?.toolName`. Kept nominal-free so the virtual module can\n * cheaply deserialize the JSON-stringified config written by the load hook.\n */\ninterface McpBackedAdapterConfig {\n\tmcp?: { toolName: string };\n}\n\n/**\n * LDS adapter configs whose input is validated against a JSON Schema at\n * invoke time. Wire, mutation, and read factories all consume this shape;\n * graphql factories skip the schema layer entirely.\n */\ninterface SchemaValidatedAdapterConfig extends McpBackedAdapterConfig {\n\tconfigJsonSchema: JSONSchema;\n}\n\ntype WireAdapterConfig = SchemaValidatedAdapterConfig;\n\ntype MutationAdapterConfig = SchemaValidatedAdapterConfig;\n\ninterface ReadAdapterConfig extends SchemaValidatedAdapterConfig {\n\tinvokerShape: ReadInvokerShape;\n}\n\n/**\n * Resolves the MCP tool name for an adapter config, or throws if none of the\n * supported backings are set. Today only `mcp` is wired up; future backings\n * (e.g. `http`) will be resolved in the same choke point.\n */\nfunction resolveMcpToolName(adapterName: string, cfg: McpBackedAdapterConfig): string {\n\tconst toolName = cfg.mcp?.toolName;\n\tif (!toolName) {\n\t\tthrow new Error(`[${adapterName}] no dispatch backing configured — expected \\`mcp.toolName\\`.`);\n\t}\n\treturn toolName;\n}\n\n/**\n * Optional envelope splitter. Converts the normalized MCP payload into a\n * `Result<Data, Error>` — used by the wire adapter so tools that return\n * `{ data, error }` land on OneStore's Err branch when `error` is set.\n * Imperative callers leave this unset and get the raw payload wrapped in\n * `ok(...)`.\n */\ntype UnwrapEnvelope<Data> = (payload: unknown) => Result<Data, Error>;\n\n/**\n * Resolves the MCP chat SDK and returns its `callTool` function, or throws a\n * consistent \"[adapter] sdk.callTool is not available\" error. Shared by the\n * LDS `McpToolCommand` and the graphql `runGraphqlQuery` — the check and\n * message are identical on both paths.\n */\nasync function getCallTool(\n\tadapterName: string,\n): Promise<(args: { toolName: string; params?: Record<string, unknown> }) => Promise<unknown>> {\n\tconst sdk = await getChatSDK();\n\tif (typeof sdk.callTool !== \"function\") {\n\t\tthrow new Error(\n\t\t\t`[${adapterName}] sdk.callTool is not available on this surface. ` +\n\t\t\t\t\"Make sure window.openai is configured or the component is running \" +\n\t\t\t\t\"in an MCP Apps / OpenAI chat context.\",\n\t\t);\n\t}\n\treturn sdk.callTool.bind(sdk);\n}\n\n/**\n * Pulls a human-readable message out of an MCP error response\n * (`{ isError: true, content: [{ type: 'text', text: ... }, ...] }`).\n * Returns an empty string if no text content is present so the caller can\n * supply a fallback.\n */\nfunction extractToolErrorText(raw: unknown): string {\n\tconst content = (raw as { content?: unknown }).content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.map((c) => {\n\t\t\tif (c && typeof c === \"object\" && (c as { type?: string }).type === \"text\") {\n\t\t\t\treturn (c as { text?: string }).text ?? \"\";\n\t\t\t}\n\t\t\treturn \"\";\n\t\t})\n\t\t.join(\" \")\n\t\t.trim();\n}\n\n/**\n * `Command` implementation that calls the configured MCP tool. One class,\n * reused across imperative and wire adapters.\n *\n * `execute()` returns a `Result<Data, unknown>`:\n * - `ok(data)` when the tool resolves — `data` is the unwrapped payload from\n * `normalizeMcpResponse` (or the result of the optional `unwrap` hook).\n * - `err(error)` when the tool rejects, when `sdk.callTool` is unavailable,\n * or when the `unwrap` hook returns `err(...)`.\n *\n * OneStore's `DefaultImperativeBindingsService` wraps this: on `ok(v)` it\n * deep-freezes and returns `v`; on `err(e)` it re-throws via `toError`. Sync\n * throws from `assertIsValid` in the `getCommand` factory are funneled through\n * `throwUserlandError`. `LWCWireBindingsService` wraps the same command\n * differently — it emits `{ data, error }` to the wire callback and attaches\n * freeze / race-guard / incomplete-config behavior.\n */\nclass McpToolCommand<Data> implements ResultCommand<Data, Error> {\n\tconstructor(\n\t\tprivate readonly adapterName: string,\n\t\tprivate readonly toolName: string,\n\t\tprivate readonly params: unknown,\n\t\tprivate readonly unwrap?: UnwrapEnvelope<Data>,\n\t) {}\n\n\tasync execute(): Promise<Result<Data, Error>> {\n\t\ttry {\n\t\t\tconst callTool = await getCallTool(this.adapterName);\n\t\t\tconst raw = await callTool({\n\t\t\t\ttoolName: this.toolName,\n\t\t\t\tparams: (this.params as Record<string, unknown>) ?? undefined,\n\t\t\t});\n\t\t\t// The MCP SDK converts handler throws into a resolved tool response\n\t\t\t// with `{ isError: true, content: [...] }` — not a transport\n\t\t\t// rejection. Surface it as an Err here so the default invoker\n\t\t\t// re-throws and the wire/legacy adapters route it through their\n\t\t\t// error channel.\n\t\t\tif (raw && typeof raw === \"object\" && (raw as { isError?: boolean }).isError) {\n\t\t\t\treturn err(new Error(extractToolErrorText(raw) || \"MCP tool error\"));\n\t\t\t}\n\t\t\tconst payload = normalizeMcpResponse(raw);\n\t\t\treturn this.unwrap ? this.unwrap(payload) : ok(payload as Data);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e : new Error(String(e)));\n\t\t}\n\t}\n}\n\n// Off-platform has no store to observe. For shapes that have no `refresh`,\n// nothing can ever trigger a post-initial update, so `subscribe` is a\n// deliberate no-op: the callback never fires and the returned unsubscribe is\n// idempotent. Shapes that *do* expose `refresh` wire subscribers into the\n// refresh path instead (see `McpToolSubscribableCommand` and the\n// `query-refreshable` graphql shape).\nconst noopUnsubscribe: Unsubscribe = () => {\n\t// no store to unsubscribe from off-platform\n};\nconst noopSubscribe = (_cb: unknown): Unsubscribe => noopUnsubscribe;\n\n/**\n * Adapts `McpToolCommand` into a `SubscribableResultCommand`. Wraps the\n * command's `Result` with `buildSubscribableResult`, supplying:\n * - `subscribe`: per-execution subscriber set. Each `execute()` call has\n * its own set so sibling invocations don't cross-pollinate. Returned\n * unsubscribe removes the callback and is idempotent.\n * - `refresh`: builds a fresh `McpToolCommand`, re-executes it, and\n * broadcasts the fresh `Result` to every registered subscriber before\n * resolving. Returns `Result<void, Error>` (ok → undefined; err → the\n * error from the fresh execute).\n *\n * Wiring subscribers into refresh mirrors on-platform behavior, where the\n * reactive store fans `refresh` results out to every listener. Off-platform\n * there is no store, so the subscriber set lives on the command itself. This\n * shim is what lets OneStore's Subscribable and Legacy services run verbatim\n * against MCP: their invokers gate on `isSubscribableResult`, which requires\n * the command's `execute()` to resolve a `SubscribableResult` (not a plain\n * `Result`).\n */\nclass McpToolSubscribableCommand<Data> implements SubscribableResultCommand<Data, Error> {\n\tconstructor(\n\t\tprivate readonly adapterName: string,\n\t\tprivate readonly toolName: string,\n\t\tprivate readonly params: unknown,\n\t\tprivate readonly unwrap?: UnwrapEnvelope<Data>,\n\t) {}\n\n\tasync execute() {\n\t\tconst base = new McpToolCommand<Data>(\n\t\t\tthis.adapterName,\n\t\t\tthis.toolName,\n\t\t\tthis.params,\n\t\t\tthis.unwrap,\n\t\t);\n\t\tconst result = await base.execute();\n\t\tconst subscribers = new Set<Callback<Result<Data, Error>>>();\n\t\tconst subscribe = (cb: Callback<Result<Data, Error>>): Unsubscribe => {\n\t\t\tsubscribers.add(cb);\n\t\t\treturn () => {\n\t\t\t\tsubscribers.delete(cb);\n\t\t\t};\n\t\t};\n\t\tconst refresh = async () => {\n\t\t\tconst next = await new McpToolCommand<Data>(\n\t\t\t\tthis.adapterName,\n\t\t\t\tthis.toolName,\n\t\t\t\tthis.params,\n\t\t\t\tthis.unwrap,\n\t\t\t).execute();\n\t\t\tsubscribers.forEach((cb) => cb(next));\n\t\t\treturn next.isOk() ? ok<void, Error>(undefined) : err(next.error);\n\t\t};\n\t\treturn buildSubscribableResult(result, subscribe, refresh);\n\t}\n}\n\n/**\n * Off-core graphql state-manager command factory. Returned function feeds\n * `createSmGraphQL(getCommand)` from\n * `@salesforce/lds-adapters-onestore-graphql/factory` — i.e. it intentionally\n * bypasses on-core's `_conduit_client_service_provisioner_v1` services\n * pipeline (instrumentation, normalized cache control, type registry,\n * `assertIsValid`, `resolveAndValidateGraphQLConfig`) and dispatches the\n * graphql query as a plain MCP tool call.\n *\n * The returned per-config command's `execute()` resolves a `Result` whose\n * shape matches what `createStateManager`'s `processQueuedConfig` expects\n * (the upstream `createSmGraphQL` wraps `createStateManager`):\n *\n * - `ok({ data: { data: <payload> }, subscribe, refresh })` — `processQueuedConfig`\n * reads `result.value.data.data` (the payload) and binds\n * `result.value.refresh` for the outer `refresh()` action.\n * - `err({ failure: UserVisibleError-with-{data: GraphQLResponse} })` —\n * `processQueuedConfig` calls `toGraphQLResponseFromFailure(result.error.failure)`\n * which extracts `.data.errors` from the `UserVisibleError`'s data field.\n *\n * `subscribe` and `refresh` are inherited verbatim from\n * `McpToolSubscribableCommand` (per-execution subscriber set, refresh\n * re-executes the tool and broadcasts to subscribers — matches the\n * on-platform contract from a state-manager-consumer perspective).\n *\n * @param name - State-manager name (`'default'` for `lightning/stateManagerGraphQL`).\n * @param cfg - Carries `mcp.toolName`. No `configJsonSchema`: this path\n * deliberately forgoes the on-core schema/`assertIsValid`/\n * `resolveAndValidateGraphQLConfig` validation layer for now;\n * malformed configs surface as MCP tool errors at execute time.\n */\nexport function createGraphqlStateManagerCommand(name: string, cfg: McpBackedAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn (config: GraphqlConfig) => ({\n\t\tasync execute() {\n\t\t\tconst base = new McpToolSubscribableCommand<GraphqlResult>(name, toolName, {\n\t\t\t\tquery: config.query,\n\t\t\t\tvariables: config.variables ?? {},\n\t\t\t\t...(config.operationName !== undefined && { operationName: config.operationName }),\n\t\t\t});\n\t\t\tconst subscribable = await base.execute();\n\t\t\tif (subscribable.isOk()) {\n\t\t\t\treturn ok(subscribable.value);\n\t\t\t}\n\t\t\t// Reshape inner `failure: Error` → `failure: UserVisibleError-with-data`\n\t\t\t// so upstream `toGraphQLResponseFromFailure(result.error.failure)`\n\t\t\t// pulls the MCP error message into `errors[0].message`. Keep the\n\t\t\t// surrounding subscribe/refresh envelope intact so the error value\n\t\t\t// is still a valid `SubscribableBase & { failure }`.\n\t\t\tconst innerError = subscribable.error.failure;\n\t\t\tconst message = innerError.message;\n\t\t\tconst userVisible = new UserVisibleError<GraphqlResult>({\n\t\t\t\tdata: undefined,\n\t\t\t\terrors: [{ message }],\n\t\t\t});\n\t\t\tuserVisible.message = message;\n\t\t\treturn err({ ...subscribable.error, failure: userVisible });\n\t\t},\n\t});\n}\n\nconst defaultImperativeService = buildDefaultImperativeBindingsServiceDescriptor().service;\nconst queryImperativeService = buildQueryImperativeBindingsServiceDescriptor().service;\nconst subscribableImperativeService =\n\tbuildSubscribableImperativeBindingsServiceDescriptor().service;\nconst legacyImperativeService = buildLegacyImperativeBindingsServiceDescriptor().service;\n\n/**\n * Mutation-shape factory. Builds an async `(config) => Promise<Data>` via\n * OneStore's `DefaultImperativeBindingsService`. Throws on validation error\n * (`throwUserlandError`) or tool error (`toError`). This is the only shape a\n * mutation ever takes on platform — mutation adapters do not carry an\n * `invokerShape` at all.\n */\nexport function createMutationAdapter(name: string, cfg: MutationAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tconst getCommand = (options: { params: unknown[]; assertIsValid: typeof assertIsValid }) => {\n\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\treturn new McpToolCommand<unknown>(name, toolName, options.params[0]);\n\t};\n\tconst invoker = defaultImperativeService.bind<unknown[], unknown>(getCommand);\n\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n}\n\n/**\n * Read-shape factory. Dispatches on `cfg.invokerShape`:\n *\n * - `legacy` — `{ invoke, subscribe }` callback surface with `{ data, error }`.\n * `subscribe` fires the callback once from the initial execute's `data`,\n * returns a no-op unsubscribe, and never fires again off-platform.\n * - `query` — `(config) => Promise<{ data }>`; one-shot read.\n * - `subscribable` — `(config) => Promise<{ data, subscribe }>`. Callback\n * passed to `subscribe` never fires; unsubscribe is a no-op.\n * - `subscribable-refreshable` — `(config) => Promise<{ data, subscribe, refresh }>`.\n * `refresh()` re-executes the MCP tool; `subscribe` is still a no-op.\n *\n * All four delegate to an OneStore service (Query / Subscribable / Legacy)\n * over `McpToolSubscribableCommand`, which preserves OneStore's deep-freeze\n * and error-funnel semantics end-to-end.\n */\nexport function createReadAdapter(name: string, cfg: ReadAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tconst getSubscribableCommand = (options: {\n\t\tparams: unknown[];\n\t\tassertIsValid: typeof assertIsValid;\n\t}) => {\n\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\treturn new McpToolSubscribableCommand<unknown>(name, toolName, options.params[0]);\n\t};\n\n\tswitch (cfg.invokerShape) {\n\t\tcase \"query\": {\n\t\t\tconst getCommand = (options: { params: unknown[]; assertIsValid: typeof assertIsValid }) => {\n\t\t\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\t\t\treturn new McpToolCommand<unknown>(name, toolName, options.params[0]);\n\t\t\t};\n\t\t\tconst invoker = queryImperativeService.bind<unknown[], unknown>(getCommand);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"subscribable\": {\n\t\t\tconst invoker = subscribableImperativeService.bind<unknown[], unknown>(\n\t\t\t\tgetSubscribableCommand,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"subscribable-refreshable\": {\n\t\t\tconst invoker = subscribableImperativeService.bind<unknown[], unknown>(\n\t\t\t\tgetSubscribableCommand,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"legacy\": {\n\t\t\t// Legacy service passes `{ config, assertIsValid }`, not `{ params, ... }`.\n\t\t\tconst getLegacyCommand = (options: {\n\t\t\t\tconfig: unknown;\n\t\t\t\tassertIsValid: typeof assertIsValid;\n\t\t\t}) => {\n\t\t\t\toptions.assertIsValid(options.config, cfg.configJsonSchema);\n\t\t\t\treturn new McpToolSubscribableCommand<unknown>(name, toolName, options.config);\n\t\t\t};\n\t\t\treturn legacyImperativeService.bind<unknown, unknown>(getLegacyCommand);\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(\n\t\t\t\t`[${name}] unsupported invokerShape: ${String((cfg as { invokerShape: unknown }).invokerShape)}. ` +\n\t\t\t\t\t`Expected 'legacy' | 'query' | 'subscribable' | 'subscribable-refreshable'.`,\n\t\t\t);\n\t}\n}\n\nconst lwcWireBindingsService = buildLWCWireBindingsServiceDescriptor().service;\n\n/**\n * Splits the MCP tool's `{ data, error }` envelope into a `Result`. Used as\n * the `unwrap` hook on `McpToolCommand` so OneStore's wire invoker sees the\n * error branch directly instead of receiving an envelope wrapped in `ok(...)`.\n *\n * Tools that don't emit the envelope (e.g. imperative) never go through this\n * path — the default imperative invoker doesn't pass `unwrap`.\n */\nfunction unwrapWireEnvelope<Data>(payload: unknown): Result<Data, Error> {\n\tconst envelope = payload as { data?: unknown; error?: unknown } | null | undefined;\n\tif (envelope && envelope.error !== undefined && envelope.error !== null) {\n\t\treturn err(toError(envelope.error));\n\t}\n\treturn ok(envelope?.data as Data);\n}\n\n/**\n * Creates an LWC wire adapter class that calls an MCP tool. Delegates to\n * OneStore's `LWCWireBindingsService`, so the returned class inherits the\n * full `CommandWireAdapterConstructor` contract: initial empty emit, config\n * `sanitize()`, `MissingRequiredPropertyError` → wait-for-next-config gating,\n * deep-freeze on success, race guard on stale resolves, and unsubscriber\n * management on disconnect.\n *\n * The `McpToolCommand` class is reused verbatim — the wire call-site only\n * supplies an `unwrap` hook so the tool's `{ data, error }` envelope lands\n * on OneStore's Err branch rather than being leaked through as an `ok(...)`\n * envelope.\n *\n * @param name - Wire adapter export name, used in MCP error messages.\n * @param cfg - MCP tool name and JSON Schema for valid wire configs.\n */\nexport function createWireAdapter(name: string, cfg: WireAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn lwcWireBindingsService.bind<unknown>(\n\t\t(config) => new McpToolCommand(name, toolName, config, unwrapWireEnvelope),\n\t\tcfg.configJsonSchema,\n\t);\n}\n\n// ─── GraphQL adapters ─────────────────────────────────────────────────────────\n\n/**\n * GraphQL adapters diverge from the base wire / mutation shapes in two ways:\n *\n * 1. Envelope is `{ data, errors[] }` instead of `{ data, error }`. Errors\n * are collected; an empty array collapses to `undefined`.\n * 2. The `_fetch` path routes thrown errors **into** the `errors[]`\n * envelope on the wire callback (never throws to the LWC host). Mutation\n * likewise resolves with `{ data, errors }` rather than rejecting.\n *\n * Dispatch is MCP-only: `getChatSDK().callTool({ toolName, params })` with\n * `normalizeMcpResponse` unwrapping. No `globalThis.__sfdc_sdk__` shortcut —\n * the on-platform behaviour is already covered by real `lightning/graphql`,\n * and every off-platform caller routes through an MCP tool like every other\n * LDS adapter.\n */\ntype GraphqlAdapterConfig = McpBackedAdapterConfig;\n\ninterface GraphqlConfig {\n\tquery: string;\n\tvariables?: Record<string, unknown>;\n\toperationName?: string;\n}\n\ninterface GraphqlResult {\n\tdata?: unknown;\n\terrors?: { message: string }[];\n}\n\ntype GraphqlWireCallback = (result: {\n\tdata: unknown;\n\terrors: { message: string }[] | undefined;\n\trefresh: () => Promise<void>;\n}) => void;\n\n/**\n * Template-literal tag that stitches the string into a plain `query` string.\n * Deliberately minimal — no AST parsing, no fragment substitution, no opaque\n * doc emulation. Matches the shape used by today's off-platform `gql`.\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.trim();\n}\n\nasync function runGraphqlQuery(\n\tadapterName: string,\n\ttoolName: string,\n\tconfig: GraphqlConfig,\n): Promise<GraphqlResult> {\n\tconst { query, variables, operationName } = config;\n\tif (!query) return { data: undefined, errors: undefined };\n\n\tconst callTool = await getCallTool(adapterName);\n\tconst raw = await callTool({\n\t\ttoolName,\n\t\tparams: {\n\t\t\tquery,\n\t\t\tvariables: variables ?? {},\n\t\t\t...(operationName !== undefined && { operationName }),\n\t\t},\n\t});\n\n\treturn (normalizeMcpResponse(raw) as GraphqlResult) ?? {};\n}\n\n/** Wraps a thrown Error into the graphql `{ data, errors[] }` envelope. */\nfunction toGraphqlErrorResult(error: unknown): GraphqlResult {\n\treturn { data: undefined, errors: [{ message: (error as Error).message }] };\n}\n\n/**\n * `runGraphqlQuery` wrapped in try/catch so thrown errors land on `errors[]`\n * instead of rejecting. Used by every graphql shape that routes errors\n * in-band (wire, mutation, imperative-read query/query-refreshable, legacy).\n */\nasync function runGraphqlQuerySafe(\n\tadapterName: string,\n\ttoolName: string,\n\tconfig: GraphqlConfig,\n): Promise<GraphqlResult> {\n\ttry {\n\t\treturn await runGraphqlQuery(adapterName, toolName, config);\n\t} catch (error) {\n\t\treturn toGraphqlErrorResult(error);\n\t}\n}\n\n/**\n * GraphQL wire adapter factory. Emits `{ data, errors, refresh }` to the wire\n * callback. Mirrors the `constructor(callback)` → `connect` / `disconnect` /\n * `update(config)` / `refresh()` contract used by the LWC wire service.\n * Thrown fetch errors are routed into `errors[0].message`.\n *\n * `_fetch` is gated on `_connected` so that the common wire lifecycle\n * (`constructor` → `update(config)` → `connect`) doesn't fire two requests:\n * the initial `update(config)` arrives before `connect()`, stores the config,\n * and waits. `connect()` does the one fetch; later `update(config)` while\n * connected re-fetches. This matches luvio's `LWCLuvioWireAdapter`, which\n * gates on the same flag to prevent duplicate endpoint calls.\n */\nexport function createGraphQLWireAdapter(name: string, cfg: GraphqlAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn class {\n\t\t_dataCallback: GraphqlWireCallback;\n\t\t_config: GraphqlConfig | undefined;\n\t\t_connected = false;\n\n\t\tconstructor(dataCallback: GraphqlWireCallback) {\n\t\t\tthis._dataCallback = dataCallback;\n\t\t}\n\n\t\tconnect() {\n\t\t\tthis._connected = true;\n\t\t\tvoid this._fetch();\n\t\t}\n\n\t\tdisconnect() {\n\t\t\tthis._connected = false;\n\t\t}\n\n\t\tupdate(config: GraphqlConfig | undefined) {\n\t\t\tthis._config = config;\n\n\t\t\tif (!this._connected || this._config === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid this._fetch();\n\t\t}\n\n\t\trefresh() {\n\t\t\treturn this._fetch();\n\t\t}\n\n\t\tasync _fetch() {\n\t\t\tthis._emit(await runGraphqlQuerySafe(name, toolName, this._config ?? { query: \"\" }));\n\t\t}\n\n\t\t_emit({ data, errors }: GraphqlResult) {\n\t\t\tthis._dataCallback({\n\t\t\t\tdata,\n\t\t\t\terrors: errors?.length ? errors : undefined,\n\t\t\t\trefresh: () => this.refresh(),\n\t\t\t});\n\t\t}\n\t};\n}\n\n/**\n * GraphQL mutation factory. Returns `async (config) => Promise<{ data, errors }>`.\n * Empty-query guard short-circuits with\n * `{ data: undefined, errors: [{ message: \"No query provided\" }] }`.\n * All other errors are routed in-band to the `errors[]` envelope — the\n * function never rejects.\n */\nexport function createGraphQLMutationAdapter(name: string, cfg: GraphqlAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn async (config: GraphqlConfig): Promise<GraphqlResult> => {\n\t\tif (!config?.query) return { data: undefined, errors: [{ message: \"No query provided\" }] };\n\t\treturn runGraphqlQuerySafe(name, toolName, config);\n\t};\n}\n\ntype GraphqlImperativeReadInvokerShape = \"query\" | \"query-refreshable\" | \"legacy\";\n\ninterface GraphqlImperativeReadAdapterConfig extends GraphqlAdapterConfig {\n\tinvokerShape: GraphqlImperativeReadInvokerShape;\n}\n\ntype GraphqlImperativeResult = GraphqlResult & {\n\tsubscribe?: (cb: (result: GraphqlResult) => void) => Unsubscribe;\n\trefresh?: () => Promise<void>;\n};\n\ntype LegacyGraphqlCallback = (result: GraphqlResult) => void;\n\n/**\n * Imperative GraphQL read factory — single entry point for all imperative\n * graphql read shapes, mirroring the LDS `createReadAdapter` pattern. The\n * `invokerShape` selects the return surface:\n *\n * - `query` — `async (config) => Promise<{ data, errors, subscribe }>`.\n * Mirrors on-platform `GraphQLImperativeBindingsService` without\n * `exposeRefresh`. Errors are routed in-band; the function never throws.\n * - `query-refreshable` — same as `query` plus `refresh()` that re-runs the\n * underlying MCP tool. Mirrors the same service with `exposeRefresh: true`.\n * - `legacy` — `{ invoke(config, context, callback),\n * subscribe(config, context, callback): Unsubscribe }`. The callback\n * always receives `{ data, errors }`; neither method throws. `context` is\n * accepted but ignored.\n *\n * In every shape `subscribe` is a deliberate no-op off-platform (no reactive\n * store); returned unsubscribes are idempotent.\n */\nexport function createGraphQLImperativeReadAdapter(\n\tname: string,\n\tcfg: GraphqlImperativeReadAdapterConfig,\n) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tif (cfg.invokerShape === \"legacy\") {\n\t\tasync function run(\n\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\tcallback: LegacyGraphqlCallback,\n\t\t): Promise<void> {\n\t\t\tif (!config?.query) {\n\t\t\t\tcallback({ data: undefined, errors: undefined });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\tcallback({\n\t\t\t\tdata: result.data,\n\t\t\t\terrors: result.errors?.length ? result.errors : undefined,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tinvoke(\n\t\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\t\t_context: unknown,\n\t\t\t\tcallback: LegacyGraphqlCallback,\n\t\t\t): void {\n\t\t\t\tvoid run(config, callback);\n\t\t\t},\n\t\t\tsubscribe(\n\t\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\t\t_context: unknown,\n\t\t\t\tcallback: LegacyGraphqlCallback,\n\t\t\t): Unsubscribe {\n\t\t\t\tvoid run(config, callback);\n\t\t\t\treturn noopUnsubscribe;\n\t\t\t},\n\t\t};\n\t}\n\n\tif (cfg.invokerShape === \"query-refreshable\") {\n\t\t// Per-invocation subscriber set: each call to the returned function\n\t\t// gets its own adapter instance with an isolated subscriber list.\n\t\t// `refresh()` re-runs the MCP tool and broadcasts the fresh\n\t\t// `{ data, errors }` to every registered callback, which mirrors the\n\t\t// on-platform contract where `refresh` causes store updates that fan\n\t\t// out through the `subscribe` fan-in. Without this wiring, `refresh`\n\t\t// would re-run the query off-platform but nothing could observe the\n\t\t// new payload (no store, noop subscribe).\n\t\treturn async (config: GraphqlConfig): Promise<GraphqlImperativeResult> => {\n\t\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\tif (result.errors?.length) {\n\t\t\t\treturn { data: undefined, errors: result.errors };\n\t\t\t}\n\t\t\tconst subscribers = new Set<(result: GraphqlResult) => void>();\n\t\t\treturn {\n\t\t\t\tdata: result.data,\n\t\t\t\terrors: undefined,\n\t\t\t\tsubscribe: (cb) => {\n\t\t\t\t\tsubscribers.add(cb);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tsubscribers.delete(cb);\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\trefresh: async () => {\n\t\t\t\t\tconst fresh = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\t\t\tconst payload: GraphqlResult = {\n\t\t\t\t\t\tdata: fresh.data,\n\t\t\t\t\t\terrors: fresh.errors?.length ? fresh.errors : undefined,\n\t\t\t\t\t};\n\t\t\t\t\tsubscribers.forEach((cb) => cb(payload));\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\t// `query` shape: no refresh → nothing can trigger a post-initial update\n\t// off-platform, so `subscribe` stays a noop. The on-platform contract\n\t// allows subscribe callbacks to fire from unrelated store writes; off-\n\t// platform there is no store, so the callback is correctly unreachable.\n\treturn async (config: GraphqlConfig): Promise<GraphqlImperativeResult> => {\n\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\tif (result.errors?.length) {\n\t\t\treturn { data: undefined, errors: result.errors };\n\t\t}\n\t\treturn {\n\t\t\tdata: result.data,\n\t\t\terrors: undefined,\n\t\t\tsubscribe: noopSubscribe,\n\t\t};\n\t};\n}\n"],"names":[],"mappings":"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"}
@@ -143,6 +143,16 @@ npm install lwc @salesforce-ux/design-system lightning-base-components
143
143
  > **Note:** `@lwc/rollup-plugin` is a required peer dependency of the plugin.
144
144
  > `lightning-base-components` is only needed if your components use `lightning/*`
145
145
  > base components (e.g., `lightning-card`, `lightning-button`).
146
+ >
147
+ > **State-manager virtual modules** (`lightning/stateManagerRecord`,
148
+ > `lightning/stateManagerObjectInfo`, `lightning/stateManagerGraphQL`) emit
149
+ > imports from `@salesforce/state-managers-uiapi/factory` and
150
+ > `@salesforce/lds-adapters-onestore-graphql/factory`. Both are declared as
151
+ > optional peer dependencies of the plugin — install them in your consumer
152
+ > only if you import any of those `lightning/stateManager*` specifiers from
153
+ > your LWCs. The graphql state manager additionally requires access to
154
+ > `@salesforce/lds-adapters-onestore-graphql` (a Salesforce-internal package),
155
+ > so external consumers should use the record/objectInfo state managers only.
146
156
 
147
157
  ### Step 2: Create `vite.config.js`
148
158
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/vite-plugin-lwc-ui-bundle",
3
- "version": "9.16.1",
3
+ "version": "9.17.0",
4
4
  "description": "Vite plugin for compiling LWC components into static bundles for off-platform and MCP use",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "Salesforce",
@@ -58,12 +58,20 @@
58
58
  },
59
59
  "peerDependencies": {
60
60
  "@lwc/rollup-plugin": "^9.0.0",
61
- "@salesforce/platform-sdk": "^9.16.1",
62
- "@salesforce/ui-bundle": "^9.16.1",
61
+ "@salesforce/lds-adapters-onestore-graphql": "^1.440.0",
62
+ "@salesforce/platform-sdk": "^9.17.0",
63
+ "@salesforce/state-managers-uiapi": "^0.30.0",
64
+ "@salesforce/ui-bundle": "^9.17.0",
63
65
  "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
64
66
  "zod": "^3.23.8"
65
67
  },
66
68
  "peerDependenciesMeta": {
69
+ "@salesforce/lds-adapters-onestore-graphql": {
70
+ "optional": true
71
+ },
72
+ "@salesforce/state-managers-uiapi": {
73
+ "optional": true
74
+ },
67
75
  "@salesforce/ui-bundle": {
68
76
  "optional": true
69
77
  }
@@ -79,7 +87,7 @@
79
87
  "devDependencies": {
80
88
  "@conduit-client/bindings-utils": "3.19.6",
81
89
  "@conduit-client/command-base": "3.19.6",
82
- "@salesforce/platform-sdk": "^9.16.1",
90
+ "@salesforce/platform-sdk": "^9.17.0",
83
91
  "typescript": "^5.9.3",
84
92
  "vite": "^7.0.0",
85
93
  "vite-plugin-dts": "^4.5.4",