{"version":3,"sources":["../../ui/src/applet-vite/vite.ts","../../ui/src/applet-vite/styles-plugin.ts"],"names":["path","createRequire","fs","os","crypto","spawnSync"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,IAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,WAAA,EAAa,oBAAoB,UAAU,CAAA;AAKrE,SAAS,oBAAoB,QAAA,EAA0B;AAC5D,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,kBAAA,IAAsB,QAAA,GAAW,UAAA;AAC1D,EAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,OAAO,IAAA,GAAO,GAAA;AAC5C;AAKO,SAAS,iBAAA,CAAkB,cAAc,IAAA,EAAc;AAC5D,EAAA,MAAM,CAAA,GAAI,QAAQ,GAAA,CAAI,gBAAA;AACtB,EAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,EAAA,EAAI;AAAC,IAAA,OAAO,WAAA;AAAA,EAAY;AACrD,EAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,WAAA;AAClC;AAWO,SAAS,uBAAuB,IAAA,EAAqC;AAC1E,EAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,kBAAkB,IAAI,CAAA;AACnC,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,IAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,cAAA;AAAA,MACR,OAAO,qBAAA,CAAsB;AAAA,QAC3B,SAAS,IAAA,CAAK,qBAAA;AAAA,QACd,YAAY,IAAA,CAAK;AAAA,OAClB;AAAA,KACH;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,OAAO,wBAAA,CAAyB;AAAA,QAC9B,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,YAAY,IAAA,CAAK;AAAA,OAClB;AAAA;AACH,GACF;AACA,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,OAAO,WAAA,CAAY,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,yBAAyB,IAAA,EAGd;AACzB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACjD,EAAA,OAAO;AAAA,IACL,CAAC,IAAA,GAAO,MAAM,GAAG,MAAA;AAAA,IACjB,CAAC,IAAA,GAAO,SAAS,GAAG;AAAA,GACtB;AACF;AAMO,SAAS,sBAAsB,IAAA,EAGoB;AACxD,EAAA,MAAM,MAAM,IAAA,EAAM,UAAA;AAClB,EAAA,MAAM,OAAA,GAAU,IAAA,EAAM,OAAA,IAAW,OAAA,CAAQ,GAAG,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,GAAA,EAAK;AAAC,IAAA,OAAO,EAAC;AAAA,EAAE;AACjC,EAAA,MAAM,OAAA,GAAUA,sBAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAChC,EAAA,OAAO;AAAA,IACL,EAAE,MAAM,yBAAA,EAA2B,WAAA,EAAaA,uBAAK,IAAA,CAAK,OAAA,EAAS,kBAAkB,CAAA,EAAE;AAAA,IACvF,EAAE,MAAM,iBAAA,EAAmB,WAAA,EAAaA,uBAAK,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAAE,GAC1E;AACF;AAQA,SAAS,WAAA,CAAY,GAAe,CAAA,EAA2B;AAC7D,EAAA,MAAM,WAAW,CAAA,CAAE,OAAA;AACnB,EAAA,MAAM,WAAW,CAAA,CAAE,OAAA;AACnB,EAAA,MAAM,UAAU,CAAA,CAAE,MAAA;AAClB,EAAA,MAAM,UAAU,CAAA,CAAE,MAAA;AAClB,EAAA,MAAM,WAAW,CAAA,CAAE,OAAA;AACnB,EAAA,MAAM,WAAW,CAAA,CAAE,OAAA;AAEnB,EAAA,MAAM,MAAA,GAAqB,EAAE,GAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAExC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,SAAS,QAAA,EAAU,KAAA;AACzB,IAAA,MAAM,SAAS,QAAA,CAAS,KAAA;AACxB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACrC,IAAA,MAAM,KAAA,GACJ,QAAA,IAAY,QAAA,GACR,CAAC,GAAI,MAAA,EAAkE,GAAI,MAAgE,CAAA,GAC1I,MAAA,KAAW,MAAA,GAAY,MAAA,GAAS,QAAA,EAAU,KAAA;AACjD,IAAA,MAAA,CAAO,OAAA,GAAU;AAAA,MACf,GAAG,QAAA;AAAA,MACH,GAAG,QAAA;AAAA,MACH,KAAA;AAAA,MACA,QAAQ,QAAA,CAAS,MAAA,IAAU,MAAA,CAAO,OAAA,EAAS,UAAU,QAAA,EAAU;AAAA,KACjE;AAAA,EACF;AACA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAA,CAAO,MAAA,GAAS,EAAE,GAAG,OAAA,EAAS,GAAG,OAAA,EAAQ;AAAA,EAC3C;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,CAAO,UAAU,CAAC,GAAI,YAAY,EAAC,EAAI,GAAG,QAAQ,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,MAAA;AACT;ACzIO,IAAM,wBAAA,GAA2B;AACxC,IAAM,cAAc,IAAA,GAAO,wBAAA;AA8B3B,SAAS,kBAAA,CAAmB,iBAAyB,IAAA,EAA6B;AAChF,EAAA,IAAIA,sBAAAA,CAAK,UAAA,CAAW,eAAe,CAAA,EAAG;AACpC,IAAA,OAAO,eAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,gBAAgB,UAAA,CAAW,GAAG,KAAK,CAAC,eAAA,CAAgB,UAAA,CAAW,GAAG,CAAA,EAAG;AACxE,IAAA,IAAI;AACF,MAAA,MAAM,MAAMC,sBAAA,CAAcD,sBAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,cAAc,CAAC,CAAA;AACzD,MAAA,OAAO,GAAA,CAAI,QAAQ,eAAe,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAOA,sBAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,eAAe,CAAA;AACxC;AAMO,SAAS,qCAAA,CACd,OAAA,GAA4C,EAAC,EACrC;AACR,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,eAAA;AACrC,EAAA,MAAM,aAAA,GAAgB,QAAQ,aAAA,IAAiB,gBAAA;AAC/C,EAAA,MAAM,qBAAqB,OAAA,CAAQ,kBAAA;AACnC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,EAAC;AAC1C,EAAA,IAAI,IAAA,GAAO,QAAQ,GAAA,EAAI;AAEvB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,8BAAA;AAAA,IACN,eAAe,MAAA,EAAQ;AACrB,MAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IACA,UAAU,EAAA,EAAY;AACpB,MAAA,IAAI,OAAO,wBAAA,EAA0B;AAAC,QAAA,OAAO,WAAA;AAAA,MAAY;AACzD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,KAAK,EAAA,EAAY;AACf,MAAA,IAAI,OAAO,WAAA,EAAa;AAAC,QAAA,OAAO,IAAA;AAAA,MAAK;AAErC,MAAA,MAAM,QAAkB,EAAC;AAEzB,MAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,QAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,CAAA,EAAG,IAAI,CAAA;AACvC,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,IAAI;AACF,YAAA,KAAA,CAAM,IAAA,CAAKE,mBAAA,CAAG,YAAA,CAAa,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,UAC3C,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAYF,sBAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA;AAC1C,MAAA,IAAI,OAAA,GAAyB,IAAA;AAG7B,MAAA,IAAIE,mBAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,QAAA,MAAM,OAAA,GAAUF,sBAAAA,CAAK,IAAA,CAAKG,mBAAA,CAAG,QAAO,EAAG,CAAA,cAAA,EAAiB,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAIC,uBAAA,CAAO,UAAA,EAAY,CAAA,IAAA,CAAM,CAAA;AAC/F,QAAA,MAAM,IAAA,GAAO,CAAC,IAAA,EAAM,SAAA,EAAW,MAAM,OAAO,CAAA;AAC5C,QAAA,IAAI,kBAAA,EAAoB;AACtB,UAAA,MAAM,UAAA,GAAaJ,sBAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,kBAAkB,CAAA;AACrD,UAAA,IAAIE,mBAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7B,YAAA,IAAA,CAAK,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,UAC5B;AAAA,QACF;AAEA,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,UAAA,GAAa,MAAA;AAC5D,QAAA,MAAM,MAAA,GAASG,wBAAU,OAAA,EAAS,CAAC,QAAQ,aAAA,EAAe,GAAG,IAAI,CAAA,EAAG;AAAA,UAClE,GAAA,EAAK,IAAA;AAAA,UACL,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,IAAI,OAAO,MAAA,KAAW,CAAA,IAAKH,mBAAA,CAAG,UAAA,CAAW,OAAO,CAAA,EAAG;AACjD,UAAA,OAAA,GAAUA,mBAAA,CAAG,YAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAC1C,UAAA,IAAI;AACF,YAAAA,mBAAA,CAAG,WAAW,OAAO,CAAA;AAAA,UACvB,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,MAAM,YAAA,GAAeF,uBAAK,UAAA,CAAW,aAAa,IAAI,aAAA,GAAgBA,sBAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,aAAa,CAAA;AACnG,QAAA,IAAI;AACF,UAAA,OAAA,GAAUE,mBAAA,CAAG,YAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AAAA,QACjD,CAAA,CAAA,MAAQ;AACN,UAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,0DAA0D,YAAY,CAAA,uFAAA;AAAA,aACxE;AAAA,UACF;AACA,UAAA,OAAA,GAAU,EAAA;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC3B,MAAA,OAAO,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA;AAAA,IAC9C;AAAA,GACF;AACF;AAMO,SAAS,wBAAA,CACd,OAAA,GAAgE,EAAC,EACzD;AACR,EAAA,OAAO,qCAAA,CAAsC;AAAA,IAC3C,GAAG,OAAA;AAAA,IACH,QAAA,EAAU,QAAQ,QAAA,IAAY,eAAA;AAAA,IAC9B,aAAA,EAAe,QAAQ,aAAA,IAAiB,gBAAA;AAAA,IACxC,UAAA,EAAY,CAAC,gCAAgC;AAAA,GAC9C,CAAA;AACH","file":"vite.cjs","sourcesContent":["/**\n * Applet Frontend Kit: Vite config helpers for applets running behind a base path\n * with dev proxy and optional local SDK aliasing.\n */\nimport type { UserConfig } from 'vite';\nimport path from 'node:path';\n\nexport type AppletViteOptions = {\n  /** Applet base path (e.g. \"/admin/ali/chat\" or \"/bi-chat\"). */\n  basePath: string\n  /** Backend URL for proxy (e.g. \"http://localhost:3200\"). */\n  backendUrl: string\n  /** Enable Vite aliases to a local SDK dist during dev iteration. Rare: prefer applet dev's managed local package. */\n  enableLocalSdkAliases?: boolean\n  /** Override SDK dist directory when enableLocalSdkAliases is true. */\n  sdkDistDir?: string\n  /** Merge additional Vite config */\n  extend?: UserConfig\n}\n\nconst DEFAULT_DEDUPE = ['react', 'react-dom', 'react-router-dom', 'react-is'];\n\n/**\n * Returns base URL for assets (with trailing slash). Uses APPLET_ASSETS_BASE env if set, otherwise derives from basePath.\n */\nexport function getAppletAssetsBase(basePath: string): string {\n  const base = process.env.APPLET_ASSETS_BASE ?? basePath + '/assets/';\n  return base.endsWith('/') ? base : base + '/';\n}\n\n/**\n * Returns dev server port from APPLET_VITE_PORT env, or the given default.\n */\nexport function getAppletVitePort(defaultPort = 5173): number {\n  const p = process.env.APPLET_VITE_PORT;\n  if (p === undefined || p === '') {return defaultPort;}\n  const n = Number(p);\n  return Number.isFinite(n) ? n : defaultPort;\n}\n\n/**\n * Builds a full Vite config for an applet: base, port, dedupe, proxy, optional local SDK aliases.\n *\n * **Merge semantics for `extend`:** When you pass `extend`, it is merged with the base config as follows:\n * - **resolve.alias**: arrays are concatenated (base aliases first, then extend aliases).\n * - **plugins**: arrays are concatenated (base plugins first, then extend plugins).\n * - **server**, **base**, **resolve.dedupe** and other scalar/object fields: extend overrides base (Object.assign-style).\n * To fully override the base config, spread first: `defineConfig({ ...createAppletViteConfig(opts), ...yourOverrides })`.\n */\nexport function createAppletViteConfig(opts: AppletViteOptions): UserConfig {\n  const base = getAppletAssetsBase(opts.basePath);\n  const port = getAppletVitePort(5173);\n  const config: UserConfig = {\n    base,\n    resolve: {\n      dedupe: DEFAULT_DEDUPE,\n      alias: createLocalSdkAliases({\n        enabled: opts.enableLocalSdkAliases,\n        sdkDistDir: opts.sdkDistDir,\n      }),\n    },\n    server: {\n      port,\n      strictPort: true,\n      proxy: createAppletBackendProxy({\n        basePath: opts.basePath,\n        backendUrl: opts.backendUrl,\n      }),\n    },\n  };\n  if (opts.extend) {\n    return mergeConfig(config, opts.extend);\n  }\n  return config;\n}\n\n/**\n * Returns proxy entries for applet RPC and stream under basePath.\n * Use as server.proxy in Vite config.\n * Note: /stream is SSE; plain string targets do not set ws or changeOrigin. If WebSocket upgrade or SSE proxying issues arise, configure proxy with ws: true or a custom configure.\n */\nexport function createAppletBackendProxy(opts: {\n  basePath: string\n  backendUrl: string\n}): Record<string, string> {\n  const base = opts.basePath.replace(/\\/+$/, '');\n  const target = opts.backendUrl.replace(/\\/+$/, '');\n  return {\n    [base + '/rpc']: target,\n    [base + '/stream']: target,\n  };\n}\n\n/**\n * Returns resolve.alias entries to point @iota-uz/sdk and @iota-uz/sdk/bichat to a local dist.\n * Rare escape hatch for non-standard local SDK layouts. Prefer applet dev's managed local package flow.\n */\nexport function createLocalSdkAliases(opts?: {\n  enabled?: boolean\n  sdkDistDir?: string\n}): Array<{ find: string | RegExp; replacement: string }> {\n  const dir = opts?.sdkDistDir;\n  const enabled = opts?.enabled ?? Boolean(dir);\n  if (!enabled || !dir) {return [];}\n  const sdkDist = path.resolve(dir);\n  return [\n    { find: /^@iota-uz\\/sdk\\/bichat$/, replacement: path.join(sdkDist, 'bichat/index.mjs') },\n    { find: /^@iota-uz\\/sdk$/, replacement: path.join(sdkDist, 'index.mjs') },\n  ];\n}\n\n/**\n * Merges base config with extend. Start with merged = { ...a, ...b } so no Vite fields from b are dropped.\n * We capture a.resolve, b.resolve, a.server, b.server, a.plugins, b.plugins before the spread so we never\n * read b's values as \"original\" a when merging. resolve.alias: only coerce to array when both sides are\n * actually arrays (concat); otherwise leave Record/object as-is and prefer b's value then a's.\n */\nfunction mergeConfig(a: UserConfig, b: UserConfig): UserConfig {\n  const aResolve = a.resolve;\n  const bResolve = b.resolve;\n  const aServer = a.server;\n  const bServer = b.server;\n  const aPlugins = a.plugins;\n  const bPlugins = b.plugins;\n\n  const merged: UserConfig = { ...a, ...b };\n\n  if (bResolve) {\n    const aAlias = aResolve?.alias;\n    const bAlias = bResolve.alias;\n    const aIsArray = Array.isArray(aAlias);\n    const bIsArray = Array.isArray(bAlias);\n    const alias =\n      aIsArray && bIsArray\n        ? [...(aAlias as Array<{ find: string | RegExp; replacement: string }>), ...(bAlias as Array<{ find: string | RegExp; replacement: string }>)]\n        : (bAlias !== undefined ? bAlias : aResolve?.alias);\n    merged.resolve = {\n      ...aResolve,\n      ...bResolve,\n      alias,\n      dedupe: bResolve.dedupe ?? merged.resolve?.dedupe ?? aResolve?.dedupe,\n    };\n  }\n  if (bServer) {\n    merged.server = { ...aServer, ...bServer };\n  }\n  if (bPlugins) {\n    merged.plugins = [...(aPlugins ?? []), ...bPlugins];\n  }\n  return merged;\n}\n","/**\n * Vite plugin that provides a virtual module exporting the compiled applet CSS string\n * for Shadow DOM injection (defineReactAppletElement({ styles })).\n * Can compile CSS via Tailwind CLI in the plugin or fall back to reading a prebuilt file.\n */\nimport type { Plugin } from 'vite';\nimport { spawnSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport const VIRTUAL_APPLET_STYLES_ID = 'virtual:applet-styles';\nconst RESOLVED_ID = '\\0' + VIRTUAL_APPLET_STYLES_ID;\n\nexport type AppletStylesVirtualModuleOptions = {\n  /**\n   * Input CSS for Tailwind (e.g. src/index.css). When set, the plugin tries to run Tailwind CLI to compile.\n   * Default: \"src/index.css\"\n   */\n  inputCss?: string\n  /**\n   * Path to Tailwind config (optional). If not set, CLI uses its default lookup.\n   */\n  tailwindConfigPath?: string\n  /**\n   * Path to the compiled CSS file when not using Tailwind CLI (fallback), or when Tailwind is not available.\n   * Default: \"dist/style.css\"\n   */\n  outputCssPath?: string\n  /**\n   * CSS to prepend: package specifiers (e.g. \"@iota-uz/sdk/bichat/styles.css\") or paths relative to project root.\n   * Specifiers are resolved via Node resolution from the project root.\n   * Default: []\n   */\n  prependCss?: string[]\n}\n\n/**\n * Resolves a prepend CSS entry: absolute paths returned as-is; non-relative, non-absolute\n * specifiers (e.g. @iota-uz/sdk/bichat/styles.css or some-lib/styles.css) are resolved via\n * Node module resolution first; relative paths are joined to root.\n */\nfunction resolvePrependPath(specifierOrPath: string, root: string): string | null {\n  if (path.isAbsolute(specifierOrPath)) {\n    return specifierOrPath;\n  }\n  if (!specifierOrPath.startsWith('.') && !specifierOrPath.startsWith('/')) {\n    try {\n      const req = createRequire(path.join(root, 'package.json'));\n      return req.resolve(specifierOrPath);\n    } catch {\n      return null;\n    }\n  }\n  return path.join(root, specifierOrPath);\n}\n\n/**\n * Creates a Vite plugin that registers virtual:applet-styles and exports the compiled CSS string.\n * When inputCss is set, tries to run Tailwind CLI to compile; if Tailwind is not available, falls back to reading outputCssPath.\n */\nexport function createAppletStylesVirtualModulePlugin(\n  options: AppletStylesVirtualModuleOptions = {}\n): Plugin {\n  const inputCss = options.inputCss ?? 'src/index.css';\n  const outputCssPath = options.outputCssPath ?? 'dist/style.css';\n  const tailwindConfigPath = options.tailwindConfigPath;\n  const prependCss = options.prependCss ?? [];\n  let root = process.cwd();\n\n  return {\n    name: 'applet-styles-virtual-module',\n    configResolved(config) {\n      root = config.root;\n    },\n    resolveId(id: string) {\n      if (id === VIRTUAL_APPLET_STYLES_ID) {return RESOLVED_ID;}\n      return null;\n    },\n    load(id: string) {\n      if (id !== RESOLVED_ID) {return null;}\n\n      const parts: string[] = [];\n\n      for (const p of prependCss) {\n        const full = resolvePrependPath(p, root);\n        if (full) {\n          try {\n            parts.push(fs.readFileSync(full, 'utf-8'));\n          } catch {\n            // Prepend file missing (e.g. optional SDK styles); skip\n          }\n        }\n      }\n\n      const inputPath = path.join(root, inputCss);\n      let mainCss: string | null = null;\n\n      // Try Tailwind CLI if input file exists. spawnSync blocks the event loop; for parallel builds consider a random suffix (e.g. crypto.randomUUID()).\n      if (fs.existsSync(inputPath)) {\n        const tmpFile = path.join(os.tmpdir(), `applet-styles-${Date.now()}-${crypto.randomUUID()}.css`);\n        const args = ['-i', inputPath, '-o', tmpFile];\n        if (tailwindConfigPath) {\n          const configPath = path.join(root, tailwindConfigPath);\n          if (fs.existsSync(configPath)) {\n            args.push('-c', configPath);\n          }\n        }\n        // Use platform-specific executable and no shell so args (paths with spaces) are passed safely on Windows.\n        const pnpmCmd = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm';\n        const result = spawnSync(pnpmCmd, ['exec', 'tailwindcss', ...args], {\n          cwd: root,\n          stdio: 'pipe',\n        });\n        if (result.status === 0 && fs.existsSync(tmpFile)) {\n          mainCss = fs.readFileSync(tmpFile, 'utf-8');\n          try {\n            fs.unlinkSync(tmpFile);\n          } catch {\n            /* ignore */\n          }\n        }\n      }\n\n      if (mainCss === null) {\n        const fallbackPath = path.isAbsolute(outputCssPath) ? outputCssPath : path.join(root, outputCssPath);\n        try {\n          mainCss = fs.readFileSync(fallbackPath, 'utf-8');\n        } catch {\n          if (process.env.NODE_ENV !== 'production') {\n            console.warn(\n              `[applet-styles] Could not compile via Tailwind CLI and ${fallbackPath} not found; export empty string. Install tailwindcss in the project or build CSS first.`\n            );\n          }\n          mainCss = '';\n        }\n      }\n\n      parts.push(mainCss);\n      const css = parts.join('\\n');\n      return `export default ${JSON.stringify(css)}`;\n    },\n  };\n}\n\n/**\n * Convenience plugin for BiChat applets: compiles app CSS and prepends SDK BiChat styles.\n * Uses default input src/index.css and package specifier @iota-uz/sdk/bichat/styles.css.\n */\nexport function createBichatStylesPlugin(\n  options: Omit<AppletStylesVirtualModuleOptions, 'prependCss'> = {}\n): Plugin {\n  return createAppletStylesVirtualModulePlugin({\n    ...options,\n    inputCss: options.inputCss ?? 'src/index.css',\n    outputCssPath: options.outputCssPath ?? 'dist/style.css',\n    prependCss: ['@iota-uz/sdk/bichat/styles.css'],\n  });\n}\n"]}