{"version":3,"sources":["../src/logger.ts","../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAEA,IAAM,IAAO,GAAA,iBAAA;AAES,IAAI,UAAA,CAAW,IAAI;AAElC,IAAM,kBAAA,GAAqB,gBAAgB,IAAI,CAAA;;;ACGtD,IAAM,mBAAmB,CAAG,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAQ1B,MAAM;AAAA,CAAA;AAER,IAAM,QAAW,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA,CAwBf,IAAK,EAAA;AAEP,eAAe,cAAe,CAAA;AAAA,EAC5B,WAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAgC,EAAA;AAC9B,EAAM,MAAA,GAAA,GAAM,IAAI,GAAI,EAAA;AACpB,EAAA,MAAM,MAAS,GAAA,MAAM,GAAI,CAAA,iBAAA,CAAkB,QAAU,EAAA;AAAA,IACnD,WAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA,EAAY,IAAK,CAAA,SAAA,CAAU,UAAU,CAAA;AAAA,IACrC,KAAA,EAAO,IAAK,CAAA,SAAA,CAAU,KAAK;AAAA,GAC5B,CAAA;AACD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAM,MAAA,IAAI,mBAAmB,wBAAwB,CAAA;AAAA;AAEvD,EAAO,OAAA,MAAA;AACT;AAEA,SAAS,kBAAqB,GAAA;AAC5B,EAAO,OAAA,IAAA,CAAK,QAAQ,MAAM,CAAA;AAC5B;AAEA,SAAS,cAAiB,GAAA;AACxB,EAAA,OAAO,sBAAsB,yCAAyC,CAAA;AACxE;AAyBO,SAAS,aAAA,CACd,OAAgC,GAAA,EACX,EAAA;AACrB,EAAA,MAAM,UAAiC,EAAC;AAExC,EAAA,MAAM,cAAc,cAAe,EAAA;AACnC,EAAM,MAAA;AAAA,IACJ,WAAc,GAAA,IAAA,CAAK,IAAK,CAAA,WAAA,EAAa,cAAc,CAAA;AAAA,IACnD,UAAa,GAAA,IAAA,CAAK,IAAK,CAAA,WAAA,EAAa,aAAa,CAAA;AAAA,IACjD,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAa,GAAA;AAAA,MACX,YAAc,EAAA,SAAA;AAAA,MACd,YAAc,EAAA,OAAA;AAAA,MACd,gBAAkB,EAAA,WAAA;AAAA,MAClB,YAAc,EAAA,SAAA;AAAA,MACd,UAAY,EAAA,OAAA;AAAA,MACZ,aAAe,EAAA;AAAA,QACb,KAAO,EAAA,MAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACX;AAAA,MACA,UAAY,EAAA;AAAA,QACV,KAAO,EAAA;AAAA,OACT;AAAA,MACA,QAAU,EAAA;AAAA,QACR,KAAO,EAAA;AAAA;AACT,KACF;AAAA,IACA,KAAQ,GAAA;AAAA,MACN,QAAU,EAAA,eAAA;AAAA,MACV,gBAAkB,EAAA,eAAA;AAAA,MAClB,IAAM,EAAA,kBAAA;AAAA,MACN,IAAM,EAAA,mBAAA;AAAA,MACN,IAAM,EAAA,kBAAA;AAAA,MACN,eAAiB,EAAA,uBAAA;AAAA,MACjB,gBAAkB,EAAA,iBAAA;AAAA,MAClB,qBAAuB,EAAA,sBAAA;AAAA,MACvB,kBAAoB,EAAA,mBAAA;AAAA,MACpB,wBAA0B,EAAA,0BAAA;AAAA,MAC1B,wBAA0B,EAAA,0BAAA;AAAA,MAC1B,eAAiB,EAAA,uBAAA;AAAA,MACjB,iBAAmB,EAAA,yBAAA;AAAA,MACnB,gBAAkB,EAAA,wBAAA;AAAA,MAClB,kBAAoB,EAAA,0BAAA;AAAA,MACpB,UAAY,EAAA,UAAA;AAAA,MACZ,aAAe,EAAA,cAAA;AAAA,MACf,UAAY,EAAA,kBAAA;AAAA,MACZ,UAAY,EAAA,kBAAA;AAAA,MACZ,OAAS,EAAA,yBAAA;AAAA,MACT,KAAO,EAAA,WAAA;AAAA,MACP,MAAQ,EAAA,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOR,GAAG,OAAQ,CAAA;AAAA;AACb,GACE,GAAA,OAAA;AAEJ,EAAI,IAAA,WAAA;AAEJ,EAAM,MAAA,EAAE,WAAa,EAAA,YAAA,EAAiB,GAAA,OAAA;AAEtC,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAA,WAAA,GAAc,kBAAmB,EAAA;AAAA,GAC5B,MAAA;AACL,IAAc,WAAA,GAAA,YAAA;AAAA;AAGhB,EAAM,MAAA,cAAA,GAAiB,IAAK,CAAA,OAAA,CAAQ,WAAW,CAAA;AAC/C,EAAA,MAAM,eAAkB,GAAA,IAAA,CAAK,IAAK,CAAA,WAAA,EAAa,cAAc,CAAA;AAC7D,EAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,IAAK,CAAA,WAAA,EAAa,aAAa,CAAA;AAC3D,EAAA,MAAM,GAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAKV,IAAK,EAAA;AAEP,EAAA,EAAA,CAAG,cAAc,WAAW,CAAA;AAC5B,EAAA,EAAA,CAAG,cAAc,IAAK,CAAA,IAAA,CAAK,WAAa,EAAA,YAAY,GAAG,gBAAgB,CAAA;AACvE,EAAA,EAAA,CAAG,cAAc,IAAK,CAAA,IAAA,CAAK,WAAa,EAAA,UAAU,GAAG,GAAG,CAAA;AAExD,EAAA,IAAI,kBAAsC,QAAY,IAAA;AAAA,IACpD;AAAA,MACE,GAAK,EAAA;AAAA;AACP,GACF;AAEA,EAAA,IAAI,gBAAkB,EAAA;AACpB,IAAkB,eAAA,GAAA,eAAA,CAAgB,GAAI,CAAA,CAAC,KAAW,MAAA;AAAA,MAChD,GAAG,gBAAA;AAAA,MACH,GAAG;AAAA,KACH,CAAA,CAAA;AAAA;AAGJ,EAAQ,OAAA,CAAA,IAAA;AAAA,IACN,GAAG,oBAAqB,CAAA;AAAA,MACtB,WAAa,EAAA;AAAA,QACX,GAAK,EAAA,cAAA;AAAA,QACL,IAAM,EAAA;AAAA,OACR;AAAA,MACA,UAAY,EAAA;AAAA,QACV,GAAA,EAAK,IAAK,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,QAC5B,IAAM,EAAA;AAAA,OACR;AAAA,MACA,QAAU,EAAA;AAAA,QACR,OAAS,EAAA,eAAA;AAAA,QACT,IAAM,EAAA,IAAA,CAAK,IAAK,CAAA,WAAA,EAAa,WAAW;AAAA,OAC1C;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD;AAAA,GACH;AAEA,EAAA,MAAM,MAAiB,GAAA;AAAA,IACrB,IAAM,EAAA,UAAA;AAAA,IACN,OAAS,EAAA,KAAA;AAAA,IACT,MAAM,OAAO,MAAQ,EAAA;AACnB,MAAA,MAAM,EAAG,CAAA,SAAA;AAAA,QACP,IAAA,CAAK,IAAK,CAAA,WAAA,EAAa,cAAc,CAAA;AAAA,QACrC,MAAM,eAAe,QAAQ;AAAA,OAC/B;AAEA,MAAI,IAAA,MAAA,CAAO,GAAK,EAAA,UAAA,KAAe,IAAM,EAAA;AACnC,QAAA,MAAA,CAAO,QAAQ,EAAC;AAChB,QAAO,MAAA,CAAA,GAAA,CAAI,eAAe,EAAC;AAC3B,QAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,MAAO,CAAA,GAAA,CAAI,UAAU,CAAG,EAAA;AACzC,UAAA,MAAA,CAAO,GAAI,CAAA,UAAA,GAAa,CAAC,MAAA,CAAO,IAAI,UAAiB,CAAA;AAAA;AAEvD,QAAO,MAAA,CAAA,GAAA,CAAI,UAAW,CAAA,IAAA,CAAK,yBAAyB,CAAA;AAAA;AAGtD,MAAO,OAAA,MAAA;AAAA;AACT,GACF;AAEA,EAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAEnB,EAAA,MAAM,QAAW,GAAA;AAAA,IACf,WAAa,EAAA,IAAA,CAAK,IAAK,CAAA,eAAA,EAAiB,mBAAmB,CAAA;AAAA,IAC3D,UAAY,EAAA,IAAA,CAAK,IAAK,CAAA,cAAA,EAAgB,aAAa,CAAA;AAAA,IACnD,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,IAAM,EAAA,WAAA;AAAA,IACN;AAAA,GACF;AACF","file":"vite-plugin-vui.mjs","sourcesContent":["import { TinyLogger, createTinyError } from '@fastkit/tiny-logger';\n\nconst name = 'vite-plugin-vui';\n\nexport const logger = new TinyLogger(name);\n\nexport const VitePluginVuiError = createTinyError(name);\n","import { Plugin } from 'vite';\nimport { dynamicSrcVitePlugin } from '@fastkit/vite-kit';\nimport path from 'node:path';\nimport fs from 'fs-extra';\nimport { RawIconFontEntry, IconFontSettings } from '@fastkit/icon-font-gen';\nimport { VuiServiceOptions } from '@fastkit/vui';\nimport { Eta } from 'eta';\nimport { VitePluginVuiError } from './logger';\n\nconst COLOR_DUMP_STYLE = `${`\n@layer vui-normalize, vui-color-scheme, vue-loading, vue-app-layout, vui;\n@include dump-color-scheme(true, \"vui-color-scheme\");\n@import '@fastkit/vue-stack/vue-stack.css';\n@import '@fastkit/vue-app-layout/vue-app-layout.css';\n@import '@fastkit/vue-loading/vue-loading.css';\n@import '@fastkit/vue-scroller/vue-scroller.css';\n@import '@fastkit/vui/vui.css';\n`.trim()}\\n`;\n\nconst TEMPLATE = `\n/* eslint-disable */\n// @ts-nocheck\nimport type { App } from 'vue';\nimport type { Router } from 'vue-router';\nimport { VPageLink } from '@fastkit/vue-page';\nimport { installVuiPlugin as _installVuiPlugin, RawVuiPluginOptions, mergeVuiPluginOptions } from '@fastkit/vui';\nimport { colorScheme } from '<%~ it.colorScheme %>';\nimport '<%~ it.mediaMatch %>';\nimport './icon-font';\nimport '@fastkit/vui/after-effects.scss';\n\nexport function installVui(settings: { app: App, router: Router }, options?: RawVuiPluginOptions) {\n  const merged = mergeVuiPluginOptions({\n    RouterLink: VPageLink,\n    colorScheme,\n    uiSettings: <%~ it.uiSettings %>,\n    icons: <%~ it.icons %>,\n    ...settings,\n  }, options);\n  _installVuiPlugin(settings.app, merged);\n}\n\nexport default installVui;\n`.trim();\n\nasync function renderTemplate({\n  colorScheme,\n  mediaMatch,\n  uiSettings,\n  icons,\n}: ViteVuiPluginResultSettings) {\n  const eta = new Eta();\n  const result = await eta.renderStringAsync(TEMPLATE, {\n    colorScheme,\n    mediaMatch,\n    uiSettings: JSON.stringify(uiSettings),\n    icons: JSON.stringify(icons),\n  });\n  if (!result) {\n    throw new VitePluginVuiError('template render error.');\n  }\n  return result;\n}\n\nfunction defaultDynamicDest() {\n  return path.resolve('.vui');\n}\n\nfunction getBuiltinsDir() {\n  return __plugboyWorkspaceDir('node_modules/@fastkit/vui/dist/builtins');\n}\n\nexport interface ViteVuiPluginOptions\n  extends Partial<Pick<VuiServiceOptions, 'uiSettings' | 'icons'>> {\n  dynamicDest?: string;\n  colorScheme?: string;\n  mediaMatch?: string;\n  iconFont?: RawIconFontEntry[];\n  iconFontDefaults?: IconFontSettings;\n  onBooted?: (() => any) | (() => Promise<any>);\n  onBootError?: ((err: unknown) => any) | ((err: unknown) => Promise<any>);\n}\n\nexport interface ViteVuiPluginResultSettings\n  extends Pick<VuiServiceOptions, 'uiSettings' | 'icons'> {\n  colorScheme: string;\n  mediaMatch: string;\n}\n\nexport interface ViteVuiPluginResult {\n  settings: ViteVuiPluginResultSettings;\n  plugins: (Plugin | Plugin[])[];\n  dest: string;\n}\n\nexport function viteVuiPlugin(\n  options: ViteVuiPluginOptions = {},\n): ViteVuiPluginResult {\n  const plugins: (Plugin | Plugin[])[] = [];\n\n  const builtinsDir = getBuiltinsDir();\n  const {\n    colorScheme = path.join(builtinsDir, 'color-scheme'),\n    mediaMatch = path.join(builtinsDir, 'media-match'),\n    iconFont,\n    iconFontDefaults,\n    onBooted,\n    onBootError,\n    uiSettings = {\n      primaryScope: 'primary' as any,\n      plainVariant: 'plain' as any,\n      containedVariant: 'contained' as any,\n      warningScope: 'warning' as any,\n      errorScope: 'error' as any,\n      buttonDefault: {\n        color: 'base' as any,\n        variant: 'contained' as any,\n      },\n      tabDefault: {\n        color: 'accent' as any,\n      },\n      dialogOk: {\n        color: 'primary' as any,\n      },\n    },\n    icons = {\n      menuDown: 'mdi-menu-down' as any,\n      navigationExpand: 'mdi-menu-down' as any,\n      prev: 'mdi-chevron-left' as any,\n      next: 'mdi-chevron-right' as any,\n      sort: 'mdi-chevron-down' as any,\n      editorTextColor: 'mdi-format-color-text' as any,\n      editorformatBold: 'mdi-format-bold' as any,\n      editorformatUnderline: 'mdi-format-underline' as any,\n      editorformatItalic: 'mdi-format-italic' as any,\n      editorformatListBulleted: 'mdi-format-list-bulleted' as any,\n      editorformatListNumbered: 'mdi-format-list-numbered' as any,\n      editorAlignLeft: 'mdi-format-align-left' as any,\n      editorAlignCenter: 'mdi-format-align-center' as any,\n      editorAlignRight: 'mdi-format-align-right' as any,\n      editorAlignJustify: 'mdi-format-align-justify' as any,\n      editorLink: 'mdi-link' as any,\n      editorLinkOff: 'mdi-link-off' as any,\n      editorUndo: 'mdi-undo-variant' as any,\n      editorRedo: 'mdi-redo-variant' as any,\n      hinttip: 'mdi-help-circle-outline' as any,\n      clear: 'mdi-close' as any,\n      reload: 'mdi-reload' as any,\n      // navigationExpand: (gen, active) => {\n      //   return gen({\n      //     name: 'mdi-menu-down' as any,\n      //     rotate: active ? 180 : 0,\n      //   });\n      // },\n      ...options.icons,\n    } as VuiServiceOptions['icons'],\n  } = options;\n\n  let dynamicDest: string;\n\n  const { dynamicDest: _dynamicDest } = options;\n\n  if (!_dynamicDest) {\n    dynamicDest = defaultDynamicDest();\n  } else {\n    dynamicDest = _dynamicDest;\n  }\n\n  const colorSchemeSrc = path.resolve(colorScheme);\n  const colorSchemeDest = path.join(dynamicDest, 'color-scheme');\n  const mediaMatchDest = path.join(dynamicDest, 'media-match');\n  const dts = `\n/// <reference path=\"./color-scheme/color-scheme.info.ts\" />\n/// <reference path=\"./icon-font/index.ts\" />\n/// <reference path=\"./media-match/media-match.ts\" />\nexport {};\n  `.trim();\n\n  fs.ensureDirSync(dynamicDest);\n  fs.writeFileSync(path.join(dynamicDest, 'setup.scss'), COLOR_DUMP_STYLE);\n  fs.writeFileSync(path.join(dynamicDest, 'vui.d.ts'), dts);\n\n  let iconFontEntries: RawIconFontEntry[] = iconFont || [\n    {\n      src: '@mdi',\n    },\n  ];\n\n  if (iconFontDefaults) {\n    iconFontEntries = iconFontEntries.map((entry) => ({\n      ...iconFontDefaults,\n      ...entry,\n    }));\n  }\n\n  plugins.push(\n    ...dynamicSrcVitePlugin({\n      colorScheme: {\n        src: colorSchemeSrc,\n        dest: colorSchemeDest,\n      },\n      mediaMatch: {\n        src: path.resolve(mediaMatch),\n        dest: mediaMatchDest,\n      },\n      iconFont: {\n        entries: iconFontEntries,\n        dest: path.join(dynamicDest, 'icon-font'),\n      },\n      onBooted,\n      onBootError,\n    }),\n  );\n\n  const plugin: Plugin = {\n    name: 'vite:vui',\n    enforce: 'pre',\n    async config(config) {\n      await fs.writeFile(\n        path.join(dynamicDest, 'installer.ts'),\n        await renderTemplate(settings),\n      );\n\n      if (config.ssr?.noExternal !== true) {\n        config.ssr ??= {};\n        config.ssr.noExternal ??= [];\n        if (!Array.isArray(config.ssr.noExternal)) {\n          config.ssr.noExternal = [config.ssr.noExternal as any];\n        }\n        config.ssr.noExternal.push(/\\/vui\\/dist\\/builtins\\//);\n      }\n\n      return config;\n    },\n  };\n\n  plugins.push(plugin);\n\n  const settings = {\n    colorScheme: path.join(colorSchemeDest, 'color-scheme.info'),\n    mediaMatch: path.join(mediaMatchDest, 'media-match'),\n    uiSettings,\n    icons,\n  };\n\n  return {\n    plugins,\n    dest: dynamicDest,\n    settings,\n  };\n}\n"]}