{"mappings":"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","names":[],"sources":["../src/index.ts"],"version":3,"sourcesContent":["import { readFileSync } from 'fs';\nimport path from 'path';\n\nimport { createFilter } from '@rollup/pluginutils';\nimport type { FilterPattern } from '@rollup/pluginutils';\nimport type { BunPlugin, JavaScriptLoader, PluginBuilder } from 'bun';\nimport { resolveSync, Transpiler } from 'bun';\n\nimport { asyncResolveFallback } from '@wyw-in-js/shared';\nimport type {\n  IFileReporterOptions,\n  PluginOptions,\n  Preprocessor,\n} from '@wyw-in-js/transform';\nimport {\n  createFileReporter,\n  slugify,\n  transform,\n  TransformCacheCollection,\n} from '@wyw-in-js/transform';\n\nexport type BunPluginOptions = {\n  debug?: IFileReporterOptions | false | null | undefined;\n  exclude?: FilterPattern;\n  filter?: RegExp | string;\n  include?: FilterPattern;\n  keepComments?: boolean | RegExp;\n  nodeModules?: boolean;\n  prefixer?: boolean;\n  preprocessor?: Preprocessor;\n  sourceMap?: boolean;\n  transformLibraries?: boolean;\n} & Partial<PluginOptions>;\n\nconst nodeModulesRegex = /^(?:.*[\\\\/])?node_modules(?:[\\\\/].*)?$/;\n\nfunction getLoader(filename: string): JavaScriptLoader {\n  const ext = path.extname(filename);\n  switch (ext) {\n    case '.jsx':\n      return 'jsx';\n    case '.ts':\n    case '.mts':\n    case '.cts':\n      return 'ts';\n    case '.tsx':\n      return 'tsx';\n    default:\n      return 'js';\n  }\n}\n\nfunction splitQueryAndHash(request: string): {\n  specifier: string;\n  suffix: string;\n} {\n  const queryIdx = request.indexOf('?');\n  const hashIdx = request.indexOf('#');\n\n  if (queryIdx === -1 && hashIdx === -1) {\n    return { specifier: request, suffix: '' };\n  }\n\n  let startIdx: number;\n  if (queryIdx === -1) {\n    startIdx = hashIdx;\n  } else if (hashIdx === -1) {\n    startIdx = queryIdx;\n  } else {\n    startIdx = Math.min(queryIdx, hashIdx);\n  }\n\n  return {\n    specifier: request.slice(0, startIdx),\n    suffix: request.slice(startIdx),\n  };\n}\n\nexport default function wywInJS({\n  debug,\n  include,\n  exclude,\n  filter = /\\.[cm]?[jt]sx?$/,\n  nodeModules = false,\n  transformLibraries,\n  sourceMap,\n  keepComments,\n  prefixer,\n  preprocessor,\n  ...rest\n}: BunPluginOptions = {}): BunPlugin {\n  const cache = new TransformCacheCollection();\n  const filterFn = createFilter(include, exclude);\n  const allowNodeModules = transformLibraries ?? nodeModules;\n\n  return {\n    name: 'wyw-in-js',\n    setup(build: PluginBuilder) {\n      const cssLookup = new Map<string, string>();\n      const emittedWarnings = new Set<string>();\n\n      const { emitter, onDone } = createFileReporter(debug ?? false);\n\n      const transpilers = new Map<\n        JavaScriptLoader,\n        InstanceType<typeof Transpiler>\n      >();\n      const getTranspiler = (\n        loader: JavaScriptLoader\n      ): InstanceType<typeof Transpiler> => {\n        const cached = transpilers.get(loader);\n        if (cached) {\n          return cached;\n        }\n\n        const created = new Transpiler({ loader, autoImportJSX: true });\n        transpilers.set(loader, created);\n        return created;\n      };\n\n      const asyncResolve = async (\n        what: string,\n        importer: string,\n        stack: string[]\n      ): Promise<string | null> => {\n        const { specifier, suffix } = splitQueryAndHash(what);\n        try {\n          return (await asyncResolveFallback(specifier, importer, stack))\n            .replace(/\\\\/g, path.posix.sep)\n            .concat(suffix);\n        } catch {\n          return resolveSync(specifier, importer)\n            .replace(/\\\\/g, path.posix.sep)\n            .concat(suffix);\n        }\n      };\n\n      const emitWarning = (message: string) => {\n        const match = message.match(/\\nconfig key: (.+)\\n/);\n        const key = match?.[1] ?? message;\n        if (emittedWarnings.has(key)) {\n          return;\n        }\n\n        emittedWarnings.add(key);\n        // eslint-disable-next-line no-console\n        console.warn(message);\n      };\n\n      build.onEnd(() => {\n        onDone(process.cwd());\n      });\n\n      build.onResolve({ filter: /\\.wyw\\.css$/ }, (args) => ({\n        namespace: 'wyw-in-js',\n        path: args.path,\n      }));\n\n      build.onLoad({ filter: /.*/, namespace: 'wyw-in-js' }, async (args) => {\n        const contents = cssLookup.get(args.path);\n        if (typeof contents === 'undefined') {\n          return undefined;\n        }\n\n        return {\n          contents,\n          loader: 'css',\n        };\n      });\n\n      const filterRegexp =\n        typeof filter === 'string' ? new RegExp(filter) : filter;\n\n      build.onLoad({ filter: filterRegexp }, async (args) => {\n        if (!filterFn(args.path)) {\n          return undefined;\n        }\n\n        if (!allowNodeModules && nodeModulesRegex.test(args.path)) {\n          return undefined;\n        }\n\n        const rawCode = readFileSync(args.path, 'utf8');\n        const loader = getLoader(args.path);\n        const transpiler = getTranspiler(loader);\n\n        const code = transpiler.transformSync(rawCode);\n\n        const transformServices = {\n          options: {\n            filename: args.path,\n            pluginOptions: rest,\n            prefixer,\n            keepComments,\n            preprocessor,\n            root: process.cwd(),\n          },\n          cache,\n          emitWarning,\n          eventEmitter: emitter,\n        };\n\n        const result = await transform(transformServices, code, asyncResolve);\n\n        const { cssText } = result;\n\n        if (typeof cssText === 'undefined') {\n          return undefined;\n        }\n\n        if (cssText === '') {\n          let contents = result.code;\n\n          if (sourceMap && result.sourceMap) {\n            const map = Buffer.from(JSON.stringify(result.sourceMap)).toString(\n              'base64'\n            );\n            contents += `\\n//# sourceMappingURL=data:application/json;base64,${map}`;\n          }\n\n          return {\n            contents,\n            loader,\n          };\n        }\n\n        const slug = slugify(cssText);\n        const cssFilename = `${args.path.replace(\n          /\\.[cm]?[jt]sx?$/,\n          ''\n        )}_${slug}.wyw.css`.replace(/\\\\/g, path.posix.sep);\n\n        let nextCssText = cssText;\n        let contents = `${result.code}\\nimport ${JSON.stringify(\n          cssFilename\n        )};\\n`;\n\n        if (sourceMap && result.cssSourceMapText) {\n          const map = Buffer.from(result.cssSourceMapText).toString('base64');\n          nextCssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;\n        }\n\n        if (sourceMap && result.sourceMap) {\n          const map = Buffer.from(JSON.stringify(result.sourceMap)).toString(\n            'base64'\n          );\n          contents += `//# sourceMappingURL=data:application/json;base64,${map}\\n`;\n        }\n\n        cssLookup.set(cssFilename, nextCssText);\n\n        return {\n          contents,\n          loader,\n        };\n      });\n    },\n  };\n}\n"],"file":"index.mjs"}
