next-yak 8.0.2 → 8.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/withYak/index.cjs
CHANGED
|
@@ -64,7 +64,7 @@ var addYak = (yakOptions, nextConfig) => {
|
|
|
64
64
|
};
|
|
65
65
|
function addYakTurbopack(nextConfig, yakOptions, yakPluginOptions) {
|
|
66
66
|
const yakLoader = removeUndefinedRecursive({
|
|
67
|
-
loader: import_node_path.default.join(currentDir, "../loaders/turbo-loader.
|
|
67
|
+
loader: import_node_path.default.join(currentDir, "../loaders/turbo-loader.cjs"),
|
|
68
68
|
options: {
|
|
69
69
|
yakOptions,
|
|
70
70
|
yakPluginOptions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../withYak/index.ts"],"sourcesContent":["/// <reference types=\"node\" />\nimport type { NextConfig } from \"next\";\nimport { existsSync } from \"node:fs\";\nimport path, { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\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 /**\n * A regex pattern to filter files based on their path.\n * Use \".css$\" to filter the raw CSS transpilation and \".css-resolved$\" for resolved CSS\n * Use true to enable debug mode for all files\n */\n debug?: boolean | string;\n transpilationMode?: \"CssModule\" | \"Css\";\n };\n};\n\nconst addYak = (yakOptions: YakConfigOptions, nextConfig: NextConfig) => {\n const minify = yakOptions.minify ?? process.env.NODE_ENV === \"production\";\n const yakPluginOptions = {\n minify,\n basePath: currentDir,\n prefix: yakOptions.prefix,\n displayNames: yakOptions.displayNames ?? !minify,\n };\n\n if (process.env.TURBOPACK === \"1\" || process.env.TURBOPACK === \"auto\") {\n addYakTurbopack(nextConfig, yakOptions, {\n ...yakPluginOptions,\n importMode: { type: \"DataUrl\" },\n });\n } else {\n addYakWebpack(nextConfig, yakOptions, {\n ...yakPluginOptions,\n importMode: {\n type: \"InlineMatchResource\",\n transpilation: yakOptions.experiments?.transpilationMode ?? \"CssModule\",\n },\n });\n }\n return nextConfig;\n};\n\n/**\n * Configure Turbopack with yak loader for CSS-in-JS transformation\n * @param nextConfig - Next.js configuration object\n * @param yakOptions - Yak configuration options\n * @param yakPluginOptions - Processed plugin options for yak-swc\n */\nfunction addYakTurbopack(\n nextConfig: NextConfig,\n yakOptions: YakConfigOptions,\n yakPluginOptions: {\n minify: boolean;\n basePath: string;\n prefix?: string;\n displayNames: boolean;\n importMode: { type: string };\n },\n) {\n // turbopack can't handle options with undefined values, so we remove them\n const yakLoader = removeUndefinedRecursive({\n loader: path.join(currentDir, \"../loaders/turbo-loader.js\"),\n options: {\n yakOptions: yakOptions,\n yakPluginOptions: yakPluginOptions,\n },\n }) as { loader: string; options: {} };\n\n nextConfig.turbopack ||= {};\n nextConfig.turbopack.rules ||= {};\n\n const ruleKey = \"*.{js,jsx,cjs,mjs,ts,tsx,cts,mts}\";\n nextConfig.turbopack.rules[ruleKey] = {\n loaders: [],\n ...nextConfig.turbopack.rules[ruleKey],\n };\n nextConfig.turbopack.rules[ruleKey].loaders.push(yakLoader);\n\n // Configure resolveAlias for custom yak context (similar to webpack)\n // This allows users to provide a custom context file that will be used\n // instead of the default baseContext\n const yakContext = resolveYakContext(yakOptions.contextPath, process.cwd());\n if (yakContext) {\n nextConfig.turbopack.resolveAlias ||= {};\n nextConfig.turbopack.resolveAlias[\"next-yak/context/baseContext\"] =\n // This is a hack around the fact that turbopack currently only supports relative paths\n // turbopack: \"server relative imports are not implemented yet\"\n // Relative is quite dangerous here as it relies on the cwd being the starting point\n `./${path.relative(process.cwd(), yakContext)}`;\n }\n}\n\n/**\n * Configure Webpack with yak SWC plugin and webpack loader for CSS-in-JS transformation\n * @param nextConfig - Next.js configuration object\n * @param yakOptions - Yak configuration options\n * @param yakPluginOptions - Processed plugin options for yak-swc\n */\nfunction addYakWebpack(\n nextConfig: NextConfig,\n yakOptions: YakConfigOptions,\n yakPluginOptions: {\n minify: boolean;\n basePath: string;\n prefix?: string;\n displayNames: boolean;\n importMode: { type: string; transpilation?: string };\n },\n) {\n // Add SWC plugin for Webpack\n nextConfig.experimental ||= {};\n nextConfig.experimental.swcPlugins ||= [];\n nextConfig.experimental.swcPlugins.push([\"yak-swc\", yakPluginOptions]);\n\n // Configure webpack loader\n const previousConfig = nextConfig.webpack;\n nextConfig.webpack = (webpackConfig, options) => {\n if (previousConfig) {\n webpackConfig = previousConfig(webpackConfig, options);\n }\n\n webpackConfig.module.rules.push({\n test:\n yakOptions.experiments?.transpilationMode === \"Css\"\n ? /\\.yak\\.css$/\n : /\\.yak\\.module\\.css$/,\n loader: path.join(currentDir, \"../loaders/webpack-loader.cjs\"),\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}\n\n/**\n * Recursively removes undefined values from an object or array.\n *\n * This function deeply traverses the input object/array and creates a new structure\n * with all undefined values filtered out. For objects, properties with undefined values\n * are omitted. For arrays, undefined elements are removed from the result.\n *\n * @param obj - The object or array to process\n * @returns A new object/array with undefined values removed, or the original value if no changes were needed\n */\nfunction removeUndefinedRecursive<T>(obj: T): {} {\n if (typeof obj !== \"object\" || obj === null) {\n return obj as {};\n }\n\n if (Array.isArray(obj)) {\n const filtered: unknown[] = [];\n for (let i = 0; i < obj.length; i++) {\n const processed = removeUndefinedRecursive(obj[i]);\n if (processed !== undefined) {\n filtered.push(processed);\n }\n }\n return filtered as {};\n }\n\n const newObj: Record<string, unknown> = {};\n let hasChanges = false;\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = removeUndefinedRecursive((obj as any)[key]);\n if (value !== undefined) {\n newObj[key] = value;\n hasChanges = true;\n }\n }\n }\n\n return hasChanges ? (newObj as {}) : obj;\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":"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","names":["path","config"]}
|
|
1
|
+
{"version":3,"sources":["../../withYak/index.ts"],"sourcesContent":["/// <reference types=\"node\" />\nimport type { NextConfig } from \"next\";\nimport { existsSync } from \"node:fs\";\nimport path, { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\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 /**\n * A regex pattern to filter files based on their path.\n * Use \".css$\" to filter the raw CSS transpilation and \".css-resolved$\" for resolved CSS\n * Use true to enable debug mode for all files\n */\n debug?: boolean | string;\n transpilationMode?: \"CssModule\" | \"Css\";\n };\n};\n\nconst addYak = (yakOptions: YakConfigOptions, nextConfig: NextConfig) => {\n const minify = yakOptions.minify ?? process.env.NODE_ENV === \"production\";\n const yakPluginOptions = {\n minify,\n basePath: currentDir,\n prefix: yakOptions.prefix,\n displayNames: yakOptions.displayNames ?? !minify,\n };\n\n if (process.env.TURBOPACK === \"1\" || process.env.TURBOPACK === \"auto\") {\n addYakTurbopack(nextConfig, yakOptions, {\n ...yakPluginOptions,\n importMode: { type: \"DataUrl\" },\n });\n } else {\n addYakWebpack(nextConfig, yakOptions, {\n ...yakPluginOptions,\n importMode: {\n type: \"InlineMatchResource\",\n transpilation: yakOptions.experiments?.transpilationMode ?? \"CssModule\",\n },\n });\n }\n return nextConfig;\n};\n\n/**\n * Configure Turbopack with yak loader for CSS-in-JS transformation\n * @param nextConfig - Next.js configuration object\n * @param yakOptions - Yak configuration options\n * @param yakPluginOptions - Processed plugin options for yak-swc\n */\nfunction addYakTurbopack(\n nextConfig: NextConfig,\n yakOptions: YakConfigOptions,\n yakPluginOptions: {\n minify: boolean;\n basePath: string;\n prefix?: string;\n displayNames: boolean;\n importMode: { type: string };\n },\n) {\n // turbopack can't handle options with undefined values, so we remove them\n const yakLoader = removeUndefinedRecursive({\n loader: path.join(currentDir, \"../loaders/turbo-loader.cjs\"),\n options: {\n yakOptions: yakOptions,\n yakPluginOptions: yakPluginOptions,\n },\n }) as { loader: string; options: {} };\n\n nextConfig.turbopack ||= {};\n nextConfig.turbopack.rules ||= {};\n\n const ruleKey = \"*.{js,jsx,cjs,mjs,ts,tsx,cts,mts}\";\n nextConfig.turbopack.rules[ruleKey] = {\n loaders: [],\n ...nextConfig.turbopack.rules[ruleKey],\n };\n nextConfig.turbopack.rules[ruleKey].loaders.push(yakLoader);\n\n // Configure resolveAlias for custom yak context (similar to webpack)\n // This allows users to provide a custom context file that will be used\n // instead of the default baseContext\n const yakContext = resolveYakContext(yakOptions.contextPath, process.cwd());\n if (yakContext) {\n nextConfig.turbopack.resolveAlias ||= {};\n nextConfig.turbopack.resolveAlias[\"next-yak/context/baseContext\"] =\n // This is a hack around the fact that turbopack currently only supports relative paths\n // turbopack: \"server relative imports are not implemented yet\"\n // Relative is quite dangerous here as it relies on the cwd being the starting point\n `./${path.relative(process.cwd(), yakContext)}`;\n }\n}\n\n/**\n * Configure Webpack with yak SWC plugin and webpack loader for CSS-in-JS transformation\n * @param nextConfig - Next.js configuration object\n * @param yakOptions - Yak configuration options\n * @param yakPluginOptions - Processed plugin options for yak-swc\n */\nfunction addYakWebpack(\n nextConfig: NextConfig,\n yakOptions: YakConfigOptions,\n yakPluginOptions: {\n minify: boolean;\n basePath: string;\n prefix?: string;\n displayNames: boolean;\n importMode: { type: string; transpilation?: string };\n },\n) {\n // Add SWC plugin for Webpack\n nextConfig.experimental ||= {};\n nextConfig.experimental.swcPlugins ||= [];\n nextConfig.experimental.swcPlugins.push([\"yak-swc\", yakPluginOptions]);\n\n // Configure webpack loader\n const previousConfig = nextConfig.webpack;\n nextConfig.webpack = (webpackConfig, options) => {\n if (previousConfig) {\n webpackConfig = previousConfig(webpackConfig, options);\n }\n\n webpackConfig.module.rules.push({\n test:\n yakOptions.experiments?.transpilationMode === \"Css\"\n ? /\\.yak\\.css$/\n : /\\.yak\\.module\\.css$/,\n loader: path.join(currentDir, \"../loaders/webpack-loader.cjs\"),\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}\n\n/**\n * Recursively removes undefined values from an object or array.\n *\n * This function deeply traverses the input object/array and creates a new structure\n * with all undefined values filtered out. For objects, properties with undefined values\n * are omitted. For arrays, undefined elements are removed from the result.\n *\n * @param obj - The object or array to process\n * @returns A new object/array with undefined values removed, or the original value if no changes were needed\n */\nfunction removeUndefinedRecursive<T>(obj: T): {} {\n if (typeof obj !== \"object\" || obj === null) {\n return obj as {};\n }\n\n if (Array.isArray(obj)) {\n const filtered: unknown[] = [];\n for (let i = 0; i < obj.length; i++) {\n const processed = removeUndefinedRecursive(obj[i]);\n if (processed !== undefined) {\n filtered.push(processed);\n }\n }\n return filtered as {};\n }\n\n const newObj: Record<string, unknown> = {};\n let hasChanges = false;\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = removeUndefinedRecursive((obj as any)[key]);\n if (value !== undefined) {\n newObj[key] = value;\n hasChanges = true;\n }\n }\n }\n\n return hasChanges ? (newObj as {}) : obj;\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":"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","names":["path","config"]}
|
package/dist/withYak/index.js
CHANGED
|
@@ -29,7 +29,7 @@ var addYak = (yakOptions, nextConfig) => {
|
|
|
29
29
|
};
|
|
30
30
|
function addYakTurbopack(nextConfig, yakOptions, yakPluginOptions) {
|
|
31
31
|
const yakLoader = removeUndefinedRecursive({
|
|
32
|
-
loader: path.join(currentDir, "../loaders/turbo-loader.
|
|
32
|
+
loader: path.join(currentDir, "../loaders/turbo-loader.cjs"),
|
|
33
33
|
options: {
|
|
34
34
|
yakOptions,
|
|
35
35
|
yakPluginOptions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../withYak/index.ts"],"sourcesContent":["/// <reference types=\"node\" />\nimport type { NextConfig } from \"next\";\nimport { existsSync } from \"node:fs\";\nimport path, { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\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 /**\n * A regex pattern to filter files based on their path.\n * Use \".css$\" to filter the raw CSS transpilation and \".css-resolved$\" for resolved CSS\n * Use true to enable debug mode for all files\n */\n debug?: boolean | string;\n transpilationMode?: \"CssModule\" | \"Css\";\n };\n};\n\nconst addYak = (yakOptions: YakConfigOptions, nextConfig: NextConfig) => {\n const minify = yakOptions.minify ?? process.env.NODE_ENV === \"production\";\n const yakPluginOptions = {\n minify,\n basePath: currentDir,\n prefix: yakOptions.prefix,\n displayNames: yakOptions.displayNames ?? !minify,\n };\n\n if (process.env.TURBOPACK === \"1\" || process.env.TURBOPACK === \"auto\") {\n addYakTurbopack(nextConfig, yakOptions, {\n ...yakPluginOptions,\n importMode: { type: \"DataUrl\" },\n });\n } else {\n addYakWebpack(nextConfig, yakOptions, {\n ...yakPluginOptions,\n importMode: {\n type: \"InlineMatchResource\",\n transpilation: yakOptions.experiments?.transpilationMode ?? \"CssModule\",\n },\n });\n }\n return nextConfig;\n};\n\n/**\n * Configure Turbopack with yak loader for CSS-in-JS transformation\n * @param nextConfig - Next.js configuration object\n * @param yakOptions - Yak configuration options\n * @param yakPluginOptions - Processed plugin options for yak-swc\n */\nfunction addYakTurbopack(\n nextConfig: NextConfig,\n yakOptions: YakConfigOptions,\n yakPluginOptions: {\n minify: boolean;\n basePath: string;\n prefix?: string;\n displayNames: boolean;\n importMode: { type: string };\n },\n) {\n // turbopack can't handle options with undefined values, so we remove them\n const yakLoader = removeUndefinedRecursive({\n loader: path.join(currentDir, \"../loaders/turbo-loader.js\"),\n options: {\n yakOptions: yakOptions,\n yakPluginOptions: yakPluginOptions,\n },\n }) as { loader: string; options: {} };\n\n nextConfig.turbopack ||= {};\n nextConfig.turbopack.rules ||= {};\n\n const ruleKey = \"*.{js,jsx,cjs,mjs,ts,tsx,cts,mts}\";\n nextConfig.turbopack.rules[ruleKey] = {\n loaders: [],\n ...nextConfig.turbopack.rules[ruleKey],\n };\n nextConfig.turbopack.rules[ruleKey].loaders.push(yakLoader);\n\n // Configure resolveAlias for custom yak context (similar to webpack)\n // This allows users to provide a custom context file that will be used\n // instead of the default baseContext\n const yakContext = resolveYakContext(yakOptions.contextPath, process.cwd());\n if (yakContext) {\n nextConfig.turbopack.resolveAlias ||= {};\n nextConfig.turbopack.resolveAlias[\"next-yak/context/baseContext\"] =\n // This is a hack around the fact that turbopack currently only supports relative paths\n // turbopack: \"server relative imports are not implemented yet\"\n // Relative is quite dangerous here as it relies on the cwd being the starting point\n `./${path.relative(process.cwd(), yakContext)}`;\n }\n}\n\n/**\n * Configure Webpack with yak SWC plugin and webpack loader for CSS-in-JS transformation\n * @param nextConfig - Next.js configuration object\n * @param yakOptions - Yak configuration options\n * @param yakPluginOptions - Processed plugin options for yak-swc\n */\nfunction addYakWebpack(\n nextConfig: NextConfig,\n yakOptions: YakConfigOptions,\n yakPluginOptions: {\n minify: boolean;\n basePath: string;\n prefix?: string;\n displayNames: boolean;\n importMode: { type: string; transpilation?: string };\n },\n) {\n // Add SWC plugin for Webpack\n nextConfig.experimental ||= {};\n nextConfig.experimental.swcPlugins ||= [];\n nextConfig.experimental.swcPlugins.push([\"yak-swc\", yakPluginOptions]);\n\n // Configure webpack loader\n const previousConfig = nextConfig.webpack;\n nextConfig.webpack = (webpackConfig, options) => {\n if (previousConfig) {\n webpackConfig = previousConfig(webpackConfig, options);\n }\n\n webpackConfig.module.rules.push({\n test:\n yakOptions.experiments?.transpilationMode === \"Css\"\n ? /\\.yak\\.css$/\n : /\\.yak\\.module\\.css$/,\n loader: path.join(currentDir, \"../loaders/webpack-loader.cjs\"),\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}\n\n/**\n * Recursively removes undefined values from an object or array.\n *\n * This function deeply traverses the input object/array and creates a new structure\n * with all undefined values filtered out. For objects, properties with undefined values\n * are omitted. For arrays, undefined elements are removed from the result.\n *\n * @param obj - The object or array to process\n * @returns A new object/array with undefined values removed, or the original value if no changes were needed\n */\nfunction removeUndefinedRecursive<T>(obj: T): {} {\n if (typeof obj !== \"object\" || obj === null) {\n return obj as {};\n }\n\n if (Array.isArray(obj)) {\n const filtered: unknown[] = [];\n for (let i = 0; i < obj.length; i++) {\n const processed = removeUndefinedRecursive(obj[i]);\n if (processed !== undefined) {\n filtered.push(processed);\n }\n }\n return filtered as {};\n }\n\n const newObj: Record<string, unknown> = {};\n let hasChanges = false;\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = removeUndefinedRecursive((obj as any)[key]);\n if (value !== undefined) {\n newObj[key] = value;\n hasChanges = true;\n }\n }\n }\n\n return hasChanges ? (newObj as {}) : obj;\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":"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","names":["config"]}
|
|
1
|
+
{"version":3,"sources":["../../withYak/index.ts"],"sourcesContent":["/// <reference types=\"node\" />\nimport type { NextConfig } from \"next\";\nimport { existsSync } from \"node:fs\";\nimport path, { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\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 /**\n * A regex pattern to filter files based on their path.\n * Use \".css$\" to filter the raw CSS transpilation and \".css-resolved$\" for resolved CSS\n * Use true to enable debug mode for all files\n */\n debug?: boolean | string;\n transpilationMode?: \"CssModule\" | \"Css\";\n };\n};\n\nconst addYak = (yakOptions: YakConfigOptions, nextConfig: NextConfig) => {\n const minify = yakOptions.minify ?? process.env.NODE_ENV === \"production\";\n const yakPluginOptions = {\n minify,\n basePath: currentDir,\n prefix: yakOptions.prefix,\n displayNames: yakOptions.displayNames ?? !minify,\n };\n\n if (process.env.TURBOPACK === \"1\" || process.env.TURBOPACK === \"auto\") {\n addYakTurbopack(nextConfig, yakOptions, {\n ...yakPluginOptions,\n importMode: { type: \"DataUrl\" },\n });\n } else {\n addYakWebpack(nextConfig, yakOptions, {\n ...yakPluginOptions,\n importMode: {\n type: \"InlineMatchResource\",\n transpilation: yakOptions.experiments?.transpilationMode ?? \"CssModule\",\n },\n });\n }\n return nextConfig;\n};\n\n/**\n * Configure Turbopack with yak loader for CSS-in-JS transformation\n * @param nextConfig - Next.js configuration object\n * @param yakOptions - Yak configuration options\n * @param yakPluginOptions - Processed plugin options for yak-swc\n */\nfunction addYakTurbopack(\n nextConfig: NextConfig,\n yakOptions: YakConfigOptions,\n yakPluginOptions: {\n minify: boolean;\n basePath: string;\n prefix?: string;\n displayNames: boolean;\n importMode: { type: string };\n },\n) {\n // turbopack can't handle options with undefined values, so we remove them\n const yakLoader = removeUndefinedRecursive({\n loader: path.join(currentDir, \"../loaders/turbo-loader.cjs\"),\n options: {\n yakOptions: yakOptions,\n yakPluginOptions: yakPluginOptions,\n },\n }) as { loader: string; options: {} };\n\n nextConfig.turbopack ||= {};\n nextConfig.turbopack.rules ||= {};\n\n const ruleKey = \"*.{js,jsx,cjs,mjs,ts,tsx,cts,mts}\";\n nextConfig.turbopack.rules[ruleKey] = {\n loaders: [],\n ...nextConfig.turbopack.rules[ruleKey],\n };\n nextConfig.turbopack.rules[ruleKey].loaders.push(yakLoader);\n\n // Configure resolveAlias for custom yak context (similar to webpack)\n // This allows users to provide a custom context file that will be used\n // instead of the default baseContext\n const yakContext = resolveYakContext(yakOptions.contextPath, process.cwd());\n if (yakContext) {\n nextConfig.turbopack.resolveAlias ||= {};\n nextConfig.turbopack.resolveAlias[\"next-yak/context/baseContext\"] =\n // This is a hack around the fact that turbopack currently only supports relative paths\n // turbopack: \"server relative imports are not implemented yet\"\n // Relative is quite dangerous here as it relies on the cwd being the starting point\n `./${path.relative(process.cwd(), yakContext)}`;\n }\n}\n\n/**\n * Configure Webpack with yak SWC plugin and webpack loader for CSS-in-JS transformation\n * @param nextConfig - Next.js configuration object\n * @param yakOptions - Yak configuration options\n * @param yakPluginOptions - Processed plugin options for yak-swc\n */\nfunction addYakWebpack(\n nextConfig: NextConfig,\n yakOptions: YakConfigOptions,\n yakPluginOptions: {\n minify: boolean;\n basePath: string;\n prefix?: string;\n displayNames: boolean;\n importMode: { type: string; transpilation?: string };\n },\n) {\n // Add SWC plugin for Webpack\n nextConfig.experimental ||= {};\n nextConfig.experimental.swcPlugins ||= [];\n nextConfig.experimental.swcPlugins.push([\"yak-swc\", yakPluginOptions]);\n\n // Configure webpack loader\n const previousConfig = nextConfig.webpack;\n nextConfig.webpack = (webpackConfig, options) => {\n if (previousConfig) {\n webpackConfig = previousConfig(webpackConfig, options);\n }\n\n webpackConfig.module.rules.push({\n test:\n yakOptions.experiments?.transpilationMode === \"Css\"\n ? /\\.yak\\.css$/\n : /\\.yak\\.module\\.css$/,\n loader: path.join(currentDir, \"../loaders/webpack-loader.cjs\"),\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}\n\n/**\n * Recursively removes undefined values from an object or array.\n *\n * This function deeply traverses the input object/array and creates a new structure\n * with all undefined values filtered out. For objects, properties with undefined values\n * are omitted. For arrays, undefined elements are removed from the result.\n *\n * @param obj - The object or array to process\n * @returns A new object/array with undefined values removed, or the original value if no changes were needed\n */\nfunction removeUndefinedRecursive<T>(obj: T): {} {\n if (typeof obj !== \"object\" || obj === null) {\n return obj as {};\n }\n\n if (Array.isArray(obj)) {\n const filtered: unknown[] = [];\n for (let i = 0; i < obj.length; i++) {\n const processed = removeUndefinedRecursive(obj[i]);\n if (processed !== undefined) {\n filtered.push(processed);\n }\n }\n return filtered as {};\n }\n\n const newObj: Record<string, unknown> = {};\n let hasChanges = false;\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = removeUndefinedRecursive((obj as any)[key]);\n if (value !== undefined) {\n newObj[key] = value;\n hasChanges = true;\n }\n }\n }\n\n return hasChanges ? (newObj as {}) : obj;\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":"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","names":["config"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "next-yak",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"types": "./dist/",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"@babel/parser": "^7.28.5",
|
|
68
68
|
"@babel/traverse": "^7.28.5",
|
|
69
69
|
"@swc/core": "1.13.20",
|
|
70
|
-
"yak-swc": "8.0.
|
|
70
|
+
"yak-swc": "8.0.3"
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
73
|
"@testing-library/jest-dom": "6.9.1",
|
package/withYak/index.ts
CHANGED
|
@@ -86,7 +86,7 @@ function addYakTurbopack(
|
|
|
86
86
|
) {
|
|
87
87
|
// turbopack can't handle options with undefined values, so we remove them
|
|
88
88
|
const yakLoader = removeUndefinedRecursive({
|
|
89
|
-
loader: path.join(currentDir, "../loaders/turbo-loader.
|
|
89
|
+
loader: path.join(currentDir, "../loaders/turbo-loader.cjs"),
|
|
90
90
|
options: {
|
|
91
91
|
yakOptions: yakOptions,
|
|
92
92
|
yakPluginOptions: yakPluginOptions,
|