{"version":3,"file":"index.mjs","names":["compiledVocabFileFilter","_compiledVocabFileFilter","_trace","compiledVocabFileFilter"],"sources":["../src/consts.ts","../src/transform-vocab-file.ts","../src/virtual-resource-loader.ts","../src/index.ts"],"sourcesContent":["import { compiledVocabFileFilter as _compiledVocabFileFilter } from '@vocab/core';\n\n/**\n * @deprecated Import from `@vocab/core` instead\n */\nexport const compiledVocabFileFilter = _compiledVocabFileFilter;\nexport const virtualModuleId = 'virtual:vocab';\nexport const sourceQueryKey = '?source=';\n","import {\n  getDevLanguageFileFromTsFile,\n  type LoadedTranslation,\n  loadTranslation,\n  type TranslationMessagesByKey,\n  type UserConfig,\n} from '@vocab/core';\n\nimport * as esModuleLexer from 'es-module-lexer';\nimport * as cjsModuleLexer from 'cjs-module-lexer';\n\nimport { sourceQueryKey, virtualModuleId } from './consts';\n\nimport { trace as _trace } from './logger';\n\nconst trace = _trace.extend('transform');\n\nfunction findExportNames(source: string, mode: 'cjs'): string[];\nfunction findExportNames(\n  source: string,\n  mode: 'esm',\n): esModuleLexer.ExportSpecifier[];\nfunction findExportNames(source: string, mode: 'cjs' | 'esm') {\n  if (mode === 'esm') {\n    const [, exports] = esModuleLexer.parse(source);\n    return exports;\n  }\n  const { exports } = cjsModuleLexer.parse(source);\n  return exports;\n}\n\nexport const transformVocabFile = async (\n  code: string,\n  id: string,\n  config: UserConfig,\n) => {\n  trace('Transforming vocab file', id);\n\n  let result = code;\n\n  const devJsonFilePath = getDevLanguageFileFromTsFile(id);\n\n  const loadedTranslation = loadTranslation(\n    { filePath: devJsonFilePath, fallbacks: 'all' },\n    config,\n  );\n\n  const renderLanguageLoader = renderLanguageLoaderAsync(loadedTranslation);\n\n  const translations = /* ts */ `\n    const translations = createTranslationFile({\n      ${Object.keys(loadedTranslation.languages)\n        .map((lang) => `${JSON.stringify(lang)}: ${renderLanguageLoader(lang)}`)\n        .join(',\\n')}\n      });\n  `;\n\n  await esModuleLexer.init;\n  const esmExports = findExportNames(code, 'esm');\n  if (esmExports.length > 0) {\n    const exportName = esmExports[0];\n    trace(`Found ESM export '${exportName.n}' in ${id}`);\n\n    result = /* ts */ `\n      import { createLanguage, createTranslationFile } from '@vocab/vite/runtime';\n      ${translations}\n      export { translations as ${exportName.n} };\n    `;\n  } else {\n    // init needs to be called and waited upon\n    await cjsModuleLexer.init();\n\n    const exportName = findExportNames(code, 'cjs')[0];\n    trace(`Found CJS export '${exportName}' in ${id}`);\n\n    result = /* ts */ `\n      import { createLanguage, createTranslationFile } from '@vocab/vite/runtime';\n      ${translations}\n      exports.${exportName} = translations;\n    `;\n  }\n  trace('Created translation file', result);\n\n  return result;\n};\n\nconst renderLanguageLoaderAsync =\n  (loadedTranslation: LoadedTranslation) => (lang: string) => {\n    const identifier = JSON.stringify(\n      createIdentifier(lang, loadedTranslation),\n    );\n\n    return /* ts */ `createLanguage(() => import(${identifier}))`.trim();\n  };\n\nconst createIdentifier = (\n  lang: string,\n  loadedTranslation: LoadedTranslation,\n) => {\n  const languageTranslations = loadedTranslation.languages[lang] ?? {};\n\n  const langJson: TranslationMessagesByKey = {};\n\n  for (const key of loadedTranslation.keys) {\n    langJson[key] = languageTranslations[key].message;\n  }\n\n  const base64 = Buffer.from(JSON.stringify(langJson), 'utf-8').toString(\n    'base64',\n  );\n\n  const encodedResource = `${sourceQueryKey}${base64}`;\n\n  return `${virtualModuleId}-${lang}.json${encodedResource}`;\n};\n","import { sourceQueryKey } from './consts';\n\nexport const virtualResourceLoader = (path: string) =>\n  Buffer.from(path.split(sourceQueryKey)[1] as string, 'base64').toString(\n    'utf-8',\n  );\n","import type { Plugin as VitePlugin } from 'vite';\nimport type { UserConfig } from '@vocab/core';\n\nimport { transformVocabFile } from './transform-vocab-file';\nimport { virtualResourceLoader } from './virtual-resource-loader';\n\nimport { trace } from './logger';\n\nimport { compiledVocabFileFilter, virtualModuleId } from './consts';\n\nexport type VocabPluginOptions = {\n  vocabConfig: UserConfig;\n};\n\nexport const vitePluginVocab = ({\n  vocabConfig,\n}: VocabPluginOptions): VitePlugin => {\n  trace(\n    `Creating Vocab plugin${\n      vocabConfig ? ` with config file ${vocabConfig}` : ''\n    }`,\n  );\n\n  return {\n    name: 'vite-plugin-vocab',\n    apply: 'build',\n    enforce: 'pre',\n    applyToEnvironment(env) {\n      return env.name === 'client';\n    },\n    resolveId(id) {\n      if (id.includes(virtualModuleId)) {\n        return `\\0${id}`;\n      }\n    },\n    load(id) {\n      if (id.includes(`\\0${virtualModuleId}`)) {\n        return {\n          code: virtualResourceLoader(id),\n          moduleType: 'json',\n        };\n      }\n    },\n    async transform(code, id) {\n      if (compiledVocabFileFilter.test(id)) {\n        const transformedCode = await transformVocabFile(code, id, vocabConfig);\n\n        return {\n          code: transformedCode,\n          map: null, // provide source map if available\n        };\n      }\n    },\n  };\n};\n"],"mappings":";;;;;;;;AAKA,MAAaA,4BAA0BC;AACvC,MAAa,kBAAkB;AAC/B,MAAa,iBAAiB;;;ACQ9B,MAAM,QAAQC,QAAO,OAAO,YAAY;AAOxC,SAAS,gBAAgB,QAAgB,MAAqB;AAC5D,KAAI,SAAS,OAAO;EAClB,MAAM,GAAG,WAAW,cAAc,MAAM,OAAO;AAC/C,SAAO;;CAET,MAAM,EAAE,YAAY,eAAe,MAAM,OAAO;AAChD,QAAO;;AAGT,MAAa,qBAAqB,OAChC,MACA,IACA,WACG;AACH,OAAM,2BAA2B,GAAG;CAEpC,IAAI,SAAS;CAIb,MAAM,oBAAoB,gBACxB;EAAE,UAHoB,6BAA6B,GAGxB;EAAE,WAAW;EAAO,EAC/C,OACD;CAED,MAAM,uBAAuB,0BAA0B,kBAAkB;CAEzE,MAAM,eAAwB;;QAExB,OAAO,KAAK,kBAAkB,UAAU,CACvC,KAAK,SAAS,GAAG,KAAK,UAAU,KAAK,CAAC,IAAI,qBAAqB,KAAK,GAAG,CACvE,KAAK,MAAM,CAAC;;;AAInB,OAAM,cAAc;CACpB,MAAM,aAAa,gBAAgB,MAAM,MAAM;AAC/C,KAAI,WAAW,SAAS,GAAG;EACzB,MAAM,aAAa,WAAW;AAC9B,QAAM,qBAAqB,WAAW,EAAE,OAAO,KAAK;AAEpD,WAAkB;;QAEd,aAAa;iCACY,WAAW,EAAE;;QAErC;AAEL,QAAM,eAAe,MAAM;EAE3B,MAAM,aAAa,gBAAgB,MAAM,MAAM,CAAC;AAChD,QAAM,qBAAqB,WAAW,OAAO,KAAK;AAElD,WAAkB;;QAEd,aAAa;gBACL,WAAW;;;AAGzB,OAAM,4BAA4B,OAAO;AAEzC,QAAO;;AAGT,MAAM,6BACH,uBAA0C,SAAiB;AAK1D,QAAgB,+BAJG,KAAK,UACtB,iBAAiB,MAAM,kBAAkB,CAGc,CAAC,IAAI,MAAM;;AAGxE,MAAM,oBACJ,MACA,sBACG;CACH,MAAM,uBAAuB,kBAAkB,UAAU,SAAS,EAAE;CAEpE,MAAM,WAAqC,EAAE;AAE7C,MAAK,MAAM,OAAO,kBAAkB,KAClC,UAAS,OAAO,qBAAqB,KAAK;AAS5C,QAAO,GAAG,gBAAgB,GAAG,KAAK,OAAO,GAFd,iBAJZ,OAAO,KAAK,KAAK,UAAU,SAAS,EAAE,QAAQ,CAAC,SAC5D,SAGgD;;;;AC7GpD,MAAa,yBAAyB,SACpC,OAAO,KAAK,KAAK,MAAM,eAAe,CAAC,IAAc,SAAS,CAAC,SAC7D,QACD;;;ACSH,MAAa,mBAAmB,EAC9B,kBACoC;AACpC,SACE,wBACE,cAAc,qBAAqB,gBAAgB,KAEtD;AAED,QAAO;EACL,MAAM;EACN,OAAO;EACP,SAAS;EACT,mBAAmB,KAAK;AACtB,UAAO,IAAI,SAAS;;EAEtB,UAAU,IAAI;AACZ,OAAI,GAAG,SAAA,gBAAyB,CAC9B,QAAO,KAAK;;EAGhB,KAAK,IAAI;AACP,OAAI,GAAG,SAAS,kBAAuB,CACrC,QAAO;IACL,MAAM,sBAAsB,GAAG;IAC/B,YAAY;IACb;;EAGL,MAAM,UAAU,MAAM,IAAI;AACxB,OAAIC,0BAAwB,KAAK,GAAG,CAGlC,QAAO;IACL,MAAM,MAHsB,mBAAmB,MAAM,IAAI,YAAY;IAIrE,KAAK;IACN;;EAGN"}