@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
76 lines (60 loc) • 2.31 kB
text/typescript
import type { CodegenPrepareHookArgs, PandaPlugin } from '@pandacss/types'
export interface NegativeTransformOptions {
spacingTokenType?: boolean
tokenType?: boolean
}
/**
* Removes negative spacing tokens
* - `spacingTokenType`: Removes negative spacing tokens from `tokens.d.ts`
* - `tokenType`: Removes negative tokens from `tokens.d.ts`
*
* @default options: { spacingTokenType: true, tokenType: true }`
*/
export const pluginRemoveNegativeSpacing = (options?: NegativeTransformOptions): PandaPlugin => {
return {
name: 'remove-negative-spacing',
hooks: {
'codegen:prepare': (args) => {
return transformNegativeSpacing(args, options ?? {})
},
},
}
}
export const transformNegativeSpacing = (args: CodegenPrepareHookArgs, options: NegativeTransformOptions) => {
const artifact = args.artifacts.find((a) => a.id === 'design-tokens')
if (!artifact) return args.artifacts
const artifactContent = artifact.files.find((f) => f.file.includes('tokens.d'))
if (!artifactContent) return args.artifacts
let fileContent = artifactContent.code
if (!fileContent) return args.artifacts
const { spacingTokenType = true, tokenType = true } = options
if (spacingTokenType) {
fileContent = artifactContent.code = updateSpacingTokenType(fileContent)
}
if (tokenType) {
artifactContent.code = updateTokenType(fileContent)
}
return args.artifacts
}
const spacingTokenRegex = /export type SpacingToken = (.+)\n/
const tokenRegex = /export type Token = (.+)\n/
const updateSpacingTokenType = (file: string) => {
const match = file.match(spacingTokenRegex)
if (!match) return file
const spacingTokenString = match[1]
const values = spacingTokenString
.split(' | ')
.map((v) => v.slice(1, -1))
.filter((v) => !v.startsWith('-'))
return file.replace(spacingTokenRegex, `export type SpacingToken = ${values.map((v) => `"${v}"`).join(' | ')}\n`)
}
const updateTokenType = (file: string) => {
const match = file.match(tokenRegex)
if (!match) return file
const tokenString = match[1]
const values = tokenString
.split(' | ')
.map((v) => v.slice(1, -1))
.filter((v) => !v.startsWith('spacing.-'))
return file.replace(tokenRegex, `export type Token = ${values.map((v) => `"${v}"`).join(' | ')}\n`)
}