kinetic-2.0.x-dev/build-utils/SdcLibraryGenerator.js

build-utils/SdcLibraryGenerator.js
// vite-plugin-sdc-library-generator.ts
import fs from 'fs';
import path from 'path';
import yaml from 'js-yaml';
import fg from 'fast-glob';

/**
 * A plugin to add the libraryOverrides section to component YAML files
 * for SDC components in a Vite build process.
 */
export default function SdcLibraryGenerator(options) {
  const baseDir = options.baseDir ? path.resolve(options.baseDir) : process.cwd();

  return {
    name: 'vite-plugin-sdc-library-generator',
    apply: 'build',

    async buildStart() {
      const entries = await fg('**/*.component.yml', {
        cwd: baseDir,
        absolute: true,
      })
      
      entries.forEach(async (entry) => {
        const folder = path.dirname(entry);
        const folderName = path.basename(folder);

        const cssFileName = `${folderName}.pcss.css`;
        const jsFileName = `${folderName}.es6.js`;
        const cssFilePath = path.join(folder, cssFileName);
        const jsFilePath = path.join(folder, jsFileName);

        let parsed = {};
        const ymlContent = await fs.promises.readFile(entry, 'utf8');

        try {
          parsed = yaml.load(ymlContent, 'utf8') || {};
        } catch (err) {
          this.error(`Failed to parse YAML at ${entry}: ${err}`);
        }

        // Initialize structure if not already present
        parsed.libraryOverrides = parsed.libraryOverrides || {};

        let modified = false;

        if (fs.existsSync(cssFilePath)) {
          if (parsed.libraryOverrides.css === undefined) {
            parsed.libraryOverrides.css = {};
          }
          parsed.libraryOverrides.css.component = {};
          parsed.libraryOverrides.css.component[cssFileName] = {};
          modified = true;
        } else if (parsed.libraryOverrides.css) {
          delete parsed.libraryOverrides.css;
          modified = true;
        }

        if (fs.existsSync(jsFilePath)) {
          if (parsed.libraryOverrides.js === undefined) {
            parsed.libraryOverrides.js = {};
          }
          parsed.libraryOverrides.js[jsFileName] = { attributes: {type: 'module'} };
          modified = true;
        } else if (parsed.libraryOverrides.js) {
          delete parsed.libraryOverrides.js;
          modified = true;
        }

        if (modified) {
          const newYaml = yaml.dump(parsed, { lineWidth: -1 });
          await fs.promises.writeFile(entry, newYaml, 'utf8');
          this.info(`Updated ${folderName}.component.yml with libraryOverrides.`);
        }
      });
    },
  };
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc