Skip to content

Commit

Permalink
feat: ✨ add tailwind config export
Browse files Browse the repository at this point in the history
  • Loading branch information
woldtwerk committed Sep 30, 2024
1 parent 65a1aa6 commit 5f1fc1e
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;
use Symfony\Component\Yaml\Yaml;

/**
* Provides field value filters for Twig templates.
Expand Down Expand Up @@ -42,6 +43,7 @@ public function getFunctions() {
new TwigFunction('URL', [$this, 'urlFromUserInput']),
new TwigFunction('HTML', [$this, 'HTML']),
new TwigFunction('class', [$this, 'classList']),
new TwigFunction('tailwind_config', [$this, 'tailwindConfig']),
];
}

Expand Down Expand Up @@ -379,4 +381,49 @@ public function classList(array $classes) {
$attribute->addClass($classes);
return $attribute;
}

/**
* Get Tailwind Config.
*
* @param string $key
* @return mixed
*/
public function tailwindConfig(?string $key) {
/** @var Drupal\Core\Theme\ThemeManager */
$theme_manager = \Drupal::service('theme.manager');
$theme = $theme_manager->getActiveTheme();

try {
$uebertool_dist_theme = current(array_filter($theme->getBaseThemeExtensions(), function($theme) {
return str_ends_with($theme->getName(), '_dist');
}));

if (!$uebertool_dist_theme) {
return '';
}

$yml = Yaml::parseFile(DRUPAL_ROOT . "/{$uebertool_dist_theme->getPath()}/{$uebertool_dist_theme->getName()}.tailwind.yml");

return $this->getValueByKey($yml, $key);
} catch (\Exception $e) {
return '';
}
}

/**
* Get dynamic value from array.
*/
function getValueByKey($array, $key) {
$keys = explode('.', $key);
$currentValue = $array;
foreach ($keys as $k) {
if (isset($currentValue[$k])) {
$currentValue = $currentValue[$k];
} else {
return null;
}
}

return $currentValue;
}
}
2 changes: 2 additions & 0 deletions packages/vite-plugin-drupal/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import virtual from './plugins/virtual'
import vuePlugin from './plugins/custom-elements'
import breakpoints from './plugins/breakpoints'
import tailwindHMR from './plugins/tailwind-hmr'
import tailwindConfig from './plugins/tailwind-config'
import vueCustomElement from './plugins/vue-custom-element'
import restart from './plugins/restart'

Expand All @@ -31,6 +32,7 @@ export default (options: UserOptions = {}): Plugin[] => {
libraries(ctx),
themeInfo(ctx),
tailwindHMR(),
tailwindConfig(ctx),
vueCustomElement(),
breakpoints(ctx),
twig(ctx),
Expand Down
51 changes: 51 additions & 0 deletions packages/vite-plugin-drupal/src/plugins/tailwind-config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import process from 'node:process'
import type { Plugin, ResolvedConfig } from 'vite'
import fse from 'fs-extra'
import YAML from 'yaml'
import resolveConfig from 'tailwindcss/resolveConfig.js'
import type { Context } from './context'

export default (ctx: Context): Plugin => {
let config: ResolvedConfig
return {
name: 'vite-plugin-uebertool-tailwind-config',
configResolved(resolvedConfig) {
config = resolvedConfig
},
async handleHotUpdate({ file }) {
if (file.match(/tailwind.config/)) {
await fse.outputFile(`${config.build.outDir}/${ctx.distThemeName}.tailwind.yml`, await buildTailwindConfig())
}
},
async buildStart() {
if (ctx.prod)
return

await fse.outputFile(`${config.build.outDir}/${ctx.distThemeName}.tailwind.yml`, await buildTailwindConfig())
},
async generateBundle(_, bundle, isWrite) {
const tailwindConfig = await buildTailwindConfig()
if (!isWrite || ctx.dev)
return

this.emitFile({
type: 'asset',
name: `${ctx.distThemeName}.tailwind.yml`,
fileName: `${ctx.distThemeName}.tailwind.yml`,
source: tailwindConfig,
})
},
}
}

async function buildTailwindConfig() {
try {
const tailwindConfigFile = await import(`${process.cwd()}/tailwind.config.js`)
const tailwindConfig = resolveConfig(tailwindConfigFile.default)
return YAML.stringify(tailwindConfig.theme)
}
catch (e) {
console.warn(`No tailwind.config.js file found in ${process.cwd()}!\n${e}`)
return ''
}
}

0 comments on commit 5f1fc1e

Please sign in to comment.