@pandabox/panda-plugins
Version:
- `missing-css-warnings` - Logs a warning message when a CSS rule was used at runtime but couldn't be statically extracted - `strict-tokens-scope` - Enforce `strictTokens` only for a set of `TokenCategory` or style props - `strict-tokens-runtime` - Enfo
117 lines (96 loc) • 3.85 kB
text/typescript
import type { CodegenPrepareHookArgs, PandaPlugin } from '@pandacss/types'
type Feature = 'no-jsx' | 'no-styled' | 'no-recipes' | 'no-patterns' | 'only-css-dir' | 'no-cva' | 'no-sva'
export interface RemoveFeaturesOptions {
features: Feature[]
}
/**
* Removes features from the `styled-system` generated folder.
* - `no-jsx`: Removes every file in `/jsx
* - `no-styled`: Removes `factory.m?(j|d.t)s` from `/jsx`
* - `no-recipes`: Removes every file in `/recipes`
* - `no-patterns`: Removes every file in `/patterns`
* - `only-css-dir`: Removes jsx/recipes/patterns files
* - `no-cva`: Removes `cva.m?(j|d.t)s` from `/css`
* - `no-sva`: Removes `sva.m?(j|d.t)s` from `/css`
*/
export const pluginRemoveFeatures = (options: RemoveFeaturesOptions): PandaPlugin => {
return {
name: 'remove-features',
hooks: {
'codegen:prepare': (args) => {
return transformFeatures(args, options)
},
},
}
}
export const transformFeatures = (args: CodegenPrepareHookArgs, options: RemoveFeaturesOptions) => {
const { features: transforms } = options
const features = {
'no-jsx': transforms.includes('no-jsx'),
'no-styled': transforms.includes('no-styled'),
'no-recipes': transforms.includes('no-recipes'),
'no-patterns': transforms.includes('no-patterns'),
'no-cva': transforms.includes('no-cva'),
'no-sva': transforms.includes('no-sva'),
'only-css-dir': transforms.includes('only-css-dir'),
}
const filtered = args.artifacts.filter((a) => {
// Remove every file in `/jsx`
if (features['no-jsx'] && a.dir?.at(-1) === 'jsx') return false
// Remove every file in `/recipes`
if (features['no-recipes'] && a.dir?.at(-1) === 'recipes') return false
// Remove every file in `/patterns`
if (features['no-patterns'] && a.dir?.at(-1) === 'patterns') return false
// Remove jsx/recipes/patterns files
if (features['only-css-dir']) {
const dir = a.dir?.at(-1)
if (dir && ['jsx', 'recipes', 'patterns'].includes(dir)) return false
}
// Remove `factory.m?(j|d.t)s` from `/jsx`
if (features['no-styled'] && a.id === 'jsx-factory') return false
// Remove `cva.m?(j|d.t)s` from `/css`
if (features['no-cva'] && a.id.includes('cva')) return false
// Remove `sva.m?(j|d.t)s` from `/css`
if (features['no-sva'] && a.id.includes('sva')) return false
return true
})
// Remove the `export * from './factory` line from `index.m?(j|d.t)s files
if (features['no-styled']) {
const jsxIndex = filtered.find((a) => a.id === 'jsx-patterns-index')
if (jsxIndex) {
jsxIndex.files.forEach((f) => {
if (!f.code) return
const lines = f.code.split('\n')
const exportFactory = lines.findIndex((l) => l.includes("export * from './factory"))
if (exportFactory === -1) return
lines.splice(exportFactory, 1)
f.code = lines.join('\n')
})
}
}
if (features['no-cva'] || features['no-sva']) {
const cssIndex = filtered.find((a) => a.id === 'css-index')
if (cssIndex) {
cssIndex.files.forEach((f) => {
if (!f.code) return
// Remove the `export * from './cva` line from `index.m?(j|d.t)s files
const lines = f.code.split('\n')
if (features['no-cva']) {
const exportIndex = lines.findIndex((l) => l.includes("export * from './cva"))
if (exportIndex > -1) {
lines.splice(exportIndex, 1)
}
}
// Remove the `export * from './sva` line from `index.m?(j|d.t)s files
if (features['no-sva']) {
const exportIndex = lines.findIndex((l) => l.includes("export * from './sva"))
if (exportIndex > -1) {
lines.splice(exportIndex, 1)
}
}
f.code = lines.join('\n')
})
}
}
return filtered
}