typed-bem
Version:
A TypeScript library for generating BEM class names.
1 lines • 3.85 kB
Source Map (JSON)
{"version":3,"file":"node.mjs","sources":["../src/node/scss.ts"],"sourcesContent":["import { writeFileSync } from 'fs';\nimport { BemBlocks, BemSchema } from '../types';\n\nexport type GenerateBemScssOptions = {\n\tlayer?: string;\n};\n\nfunction generateBemScssFile<B extends BemBlocks<BemSchema>>(bemDefinition: B, outputPath: string, options?: GenerateBemScssOptions) {\n\tconst scssLines: string[] = [];\n\n\t// Check for explicitly empty layer and warn\n\tconst shouldUseLayer = options?.layer !== undefined && options.layer !== '';\n\tconst hasEmptyLayer = options?.layer === '';\n\n\tif (hasEmptyLayer) {\n\t\tconsole.warn('Warning: Empty layer name provided. No CSS layer will be generated.');\n\t}\n\n\t// Add CSS layer if specified and not empty\n\tif (shouldUseLayer) {\n\t\tscssLines.push(`@layer ${options.layer} {`);\n\t}\n\n\tObject.entries(bemDefinition).forEach(([blockName, blockDefinition]) => {\n\t\t// Add the block\n\t\tconst indent = shouldUseLayer ? ' ' : '';\n\t\tscssLines.push(`${indent}.${blockName} {`);\n\n\t\t// Process block modifiers\n\t\tif (blockDefinition.modifiers && blockDefinition.modifiers instanceof Set) {\n\t\t\tblockDefinition.modifiers.forEach((modifier) => {\n\t\t\t\tscssLines.push(`${indent} &--${modifier} {`);\n\t\t\t\tscssLines.push(`${indent} // Styles for ${blockName}--${modifier}`);\n\t\t\t\tscssLines.push(`${indent} }`);\n\t\t\t});\n\t\t}\n\n\t\t// Process elements\n\t\tif (blockDefinition.elements) {\n\t\t\tObject.entries(blockDefinition.elements).forEach(([elementName, elementDefinition]) => {\n\t\t\t\tscssLines.push(`${indent} &__${elementName} {`);\n\n\t\t\t\t// Process element modifiers\n\t\t\t\tif (elementDefinition.modifiers && elementDefinition.modifiers instanceof Set) {\n\t\t\t\t\telementDefinition.modifiers.forEach((modifier) => {\n\t\t\t\t\t\tscssLines.push(`${indent} &--${modifier} {`);\n\t\t\t\t\t\tscssLines.push(`${indent} // Styles for ${blockName}__${elementName}--${modifier}`);\n\t\t\t\t\t\tscssLines.push(`${indent} }`);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tscssLines.push(`${indent} // Styles for ${blockName}__${elementName}`);\n\t\t\t\t}\n\n\t\t\t\tscssLines.push(`${indent} }`);\n\t\t\t});\n\t\t}\n\n\t\tscssLines.push(`${indent}}`);\n\t});\n\n\t// Close CSS layer if specified and not empty\n\tif (shouldUseLayer) {\n\t\tscssLines.push('}');\n\t}\n\n\t// Write the SCSS structure to the output file\n\twriteFileSync(`${outputPath}.scss`, scssLines.join('\\n'), 'utf8');\n}\n\nexport { generateBemScssFile };\n"],"names":["generateBemScssFile","bemDefinition","outputPath","options","scssLines","shouldUseLayer","blockName","blockDefinition","indent","modifier","elementName","elementDefinition","writeFileSync"],"mappings":"mCAOA,SAASA,EAAoDC,EAAkBC,EAAoBC,EAAkC,CACpI,MAAMC,EAAsB,CAAA,EAGtBC,EAAiBF,GAAS,QAAU,QAAaA,EAAQ,QAAU,GACnDA,GAAS,QAAU,IAGxC,QAAQ,KAAK,qEAAqE,EAI/EE,GACHD,EAAU,KAAK,UAAUD,EAAQ,KAAK,IAAI,EAG3C,OAAO,QAAQF,CAAa,EAAE,QAAQ,CAAC,CAACK,EAAWC,CAAe,IAAM,CAEvE,MAAMC,EAASH,EAAiB,KAAO,GACvCD,EAAU,KAAK,GAAGI,CAAM,IAAIF,CAAS,IAAI,EAGrCC,EAAgB,WAAaA,EAAgB,qBAAqB,KACrEA,EAAgB,UAAU,QAASE,GAAa,CAC/CL,EAAU,KAAK,GAAGI,CAAM,QAAQC,CAAQ,IAAI,EAC5CL,EAAU,KAAK,GAAGI,CAAM,qBAAqBF,CAAS,KAAKG,CAAQ,EAAE,EACrEL,EAAU,KAAK,GAAGI,CAAM,KAAK,CAC9B,CAAC,EAIED,EAAgB,UACnB,OAAO,QAAQA,EAAgB,QAAQ,EAAE,QAAQ,CAAC,CAACG,EAAaC,CAAiB,IAAM,CACtFP,EAAU,KAAK,GAAGI,CAAM,QAAQE,CAAW,IAAI,EAG3CC,EAAkB,WAAaA,EAAkB,qBAAqB,IACzEA,EAAkB,UAAU,QAASF,GAAa,CACjDL,EAAU,KAAK,GAAGI,CAAM,UAAUC,CAAQ,IAAI,EAC9CL,EAAU,KAAK,GAAGI,CAAM,uBAAuBF,CAAS,KAAKI,CAAW,KAAKD,CAAQ,EAAE,EACvFL,EAAU,KAAK,GAAGI,CAAM,OAAO,CAChC,CAAC,EAEDJ,EAAU,KAAK,GAAGI,CAAM,qBAAqBF,CAAS,KAAKI,CAAW,EAAE,EAGzEN,EAAU,KAAK,GAAGI,CAAM,KAAK,CAC9B,CAAC,EAGFJ,EAAU,KAAK,GAAGI,CAAM,GAAG,CAC5B,CAAC,EAGGH,GACHD,EAAU,KAAK,GAAG,EAInBQ,EAAc,GAAGV,CAAU,QAASE,EAAU,KAAK;AAAA,CAAI,EAAG,MAAM,CACjE"}