{"version":3,"sources":["../../withYak/index.ts"],"sourcesContent":["/// <reference types=\"node\" />\nimport { existsSync } from \"node:fs\";\nimport path, { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { NextConfig } from \"../../example/node_modules/next/dist/server/config.js\";\n\nconst currentDir =\n  typeof __dirname !== \"undefined\"\n    ? __dirname\n    : dirname(fileURLToPath(import.meta.url));\n\nexport type YakConfigOptions = {\n  /**\n   * Generate compact CSS class and variable names.\n   * @defaultValue\n   * enabled if NODE_ENV is set to `production`, otherwise disabled\n   */\n  minify?: boolean;\n  contextPath?: string;\n  /**\n   * Optional prefix for generated CSS identifiers.\n   * This can be used to ensure unique class names across different applications\n   * or to add organization-specific prefixes.\n   */\n  prefix?: string;\n  /**\n   * Adds `displayName` to each component for better React DevTools debugging\n   * - Enabled by default in development mode\n   * - Disabled by default in production\n   * - Increases bundle size slightly when enabled\n   */\n  displayNames?: boolean;\n  experiments?: {\n    debug?:\n      | boolean\n      | {\n          filter?: (path: string) => boolean;\n          type: \"all\" | \"ts\" | \"css\" | \"css resolved\";\n        };\n  };\n};\n\nconst addYak = (yakOptions: YakConfigOptions, nextConfig: NextConfig) => {\n  const previousConfig = nextConfig.webpack;\n  const minify =\n    yakOptions.minify !== undefined\n      ? yakOptions.minify\n      : process.env.NODE_ENV === \"production\";\n\n  nextConfig.experimental ||= {};\n  nextConfig.experimental.swcPlugins ||= [];\n  nextConfig.experimental.swcPlugins.push([\n    \"yak-swc\",\n    {\n      minify,\n      basePath: currentDir,\n      prefix: yakOptions.prefix,\n      displayNames: yakOptions.displayNames ?? !minify,\n    },\n  ]);\n\n  nextConfig.webpack = (webpackConfig, options) => {\n    if (previousConfig) {\n      webpackConfig = previousConfig(webpackConfig, options);\n    }\n\n    webpackConfig.module.rules.push({\n      test: /\\.yak\\.module\\.css$/,\n      loader: path.join(currentDir, \"../loaders/css-loader.js\"),\n      options: yakOptions,\n    });\n\n    // With the following alias the internal next-yak code\n    // is able to import a context which works for server components\n    const yakContext = resolveYakContext(\n      yakOptions.contextPath,\n      webpackConfig.context || process.cwd(),\n    );\n    if (yakContext) {\n      webpackConfig.resolve.alias[\"next-yak/context/baseContext\"] = yakContext;\n    }\n\n    return webpackConfig;\n  };\n  return nextConfig;\n};\n\n/**\n * Try to resolve yak\n */\nfunction resolveYakContext(contextPath: string | undefined, cwd: string) {\n  const yakContext = contextPath\n    ? path.resolve(cwd, contextPath)\n    : path.resolve(cwd, \"yak.context\");\n  const extensions = [\"\", \".ts\", \".tsx\", \".js\", \".jsx\"];\n  for (const extension in extensions) {\n    const fileName = yakContext + extensions[extension];\n    if (existsSync(fileName)) {\n      return fileName;\n    }\n  }\n  if (contextPath) {\n    throw new Error(`Could not find yak context file at ${yakContext}`);\n  }\n}\n\n// Wrapper to allow sync, async, and function configuration of Next.js\n/**\n * Add Yak to your Next.js app\n *\n * @usage\n *\n * ```ts\n * // next.config.js\n * const { withYak } = require(\"next-yak/withYak\");\n * const nextConfig = {\n *   // your next config here\n * };\n * module.exports = withYak(nextConfig);\n * ```\n *\n * With a custom yakConfig\n *\n * ```ts\n * // next.config.js\n * const { withYak } = require(\"next-yak/withYak\");\n * const nextConfig = {\n *   // your next config here\n * };\n * const yakConfig = {\n *   // Optional prefix for generated CSS identifiers\n *   prefix: \"my-app\",\n *   // Other yak config options...\n * };\n * module.exports = withYak(yakConfig, nextConfig);\n * ```\n */\nexport const withYak: {\n  <\n    T extends\n      | Record<string, any>\n      | ((...args: any[]) => Record<string, any>)\n      | ((...args: any[]) => Promise<Record<string, any>>),\n  >(\n    yakOptions: YakConfigOptions,\n    nextConfig: T,\n  ): T;\n  // no yakConfig\n  <\n    T extends\n      | Record<string, any>\n      | ((...args: any[]) => Record<string, any>)\n      | ((...args: any[]) => Promise<Record<string, any>>),\n  >(\n    nextConfig: T,\n    _?: undefined,\n  ): T;\n} = (maybeYakOptions, nextConfig) => {\n  if (nextConfig === undefined) {\n    return withYak({}, maybeYakOptions);\n  }\n  // If the second parameter is present the first parameter must be a YakConfigOptions\n  const yakOptions = maybeYakOptions as YakConfigOptions;\n  if (typeof nextConfig === \"function\") {\n    /**\n     * A NextConfig can be a sync or async function\n     * https://nextjs.org/docs/pages/api-reference/next-config-js\n     * @param {any[]} args\n     */\n    return (...args) => {\n      /** Dynamic Next Configs can be async or sync */\n      const config = nextConfig(...args) as NextConfig | Promise<NextConfig>;\n      return config instanceof Promise\n        ? config.then((config) => addYak(yakOptions, config))\n        : addYak(yakOptions, config);\n    };\n  }\n  return addYak(yakOptions, nextConfig);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAA2B;AAC3B,uBAA8B;AAC9B,sBAA8B;AAH9B;AAMA,IAAM,aACJ,OAAO,cAAc,cACjB,gBACA,8BAAQ,+BAAc,YAAY,GAAG,CAAC;AAiC5C,IAAM,SAAS,CAAC,YAA8B,eAA2B;AACvE,QAAM,iBAAiB,WAAW;AAClC,QAAM,SACJ,WAAW,WAAW,SAClB,WAAW,SACX,QAAQ,IAAI,aAAa;AAE/B,aAAW,iBAAiB,CAAC;AAC7B,aAAW,aAAa,eAAe,CAAC;AACxC,aAAW,aAAa,WAAW,KAAK;AAAA,IACtC;AAAA,IACA;AAAA,MACE;AAAA,MACA,UAAU;AAAA,MACV,QAAQ,WAAW;AAAA,MACnB,cAAc,WAAW,gBAAgB,CAAC;AAAA,IAC5C;AAAA,EACF,CAAC;AAED,aAAW,UAAU,CAAC,eAAe,YAAY;AAC/C,QAAI,gBAAgB;AAClB,sBAAgB,eAAe,eAAe,OAAO;AAAA,IACvD;AAEA,kBAAc,OAAO,MAAM,KAAK;AAAA,MAC9B,MAAM;AAAA,MACN,QAAQ,iBAAAA,QAAK,KAAK,YAAY,0BAA0B;AAAA,MACxD,SAAS;AAAA,IACX,CAAC;AAID,UAAM,aAAa;AAAA,MACjB,WAAW;AAAA,MACX,cAAc,WAAW,QAAQ,IAAI;AAAA,IACvC;AACA,QAAI,YAAY;AACd,oBAAc,QAAQ,MAAM,8BAA8B,IAAI;AAAA,IAChE;AAEA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKA,SAAS,kBAAkB,aAAiC,KAAa;AACvE,QAAM,aAAa,cACf,iBAAAA,QAAK,QAAQ,KAAK,WAAW,IAC7B,iBAAAA,QAAK,QAAQ,KAAK,aAAa;AACnC,QAAM,aAAa,CAAC,IAAI,OAAO,QAAQ,OAAO,MAAM;AACpD,aAAW,aAAa,YAAY;AAClC,UAAM,WAAW,aAAa,WAAW,SAAS;AAClD,YAAI,2BAAW,QAAQ,GAAG;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,aAAa;AACf,UAAM,IAAI,MAAM,sCAAsC,UAAU,EAAE;AAAA,EACpE;AACF;AAiCO,IAAM,UAoBT,CAAC,iBAAiB,eAAe;AACnC,MAAI,eAAe,QAAW;AAC5B,WAAO,QAAQ,CAAC,GAAG,eAAe;AAAA,EACpC;AAEA,QAAM,aAAa;AACnB,MAAI,OAAO,eAAe,YAAY;AAMpC,WAAO,IAAI,SAAS;AAElB,YAAM,SAAS,WAAW,GAAG,IAAI;AACjC,aAAO,kBAAkB,UACrB,OAAO,KAAK,CAACC,YAAW,OAAO,YAAYA,OAAM,CAAC,IAClD,OAAO,YAAY,MAAM;AAAA,IAC/B;AAAA,EACF;AACA,SAAO,OAAO,YAAY,UAAU;AACtC;","names":["path","config"]}