import fs from "fs"; import path from "path"; import { fileURLToPath } from "node:url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Paths const findNearestNodeModules = (dir) => { const nodeModulesPath = path.join(dir, "node_modules"); if (fs.existsSync(nodeModulesPath)) { return nodeModulesPath; } const parentDir = path.dirname(dir); if (parentDir === dir) { throw new Error("No node_modules directory found"); } return findNearestNodeModules(parentDir); }; const nodeModulesPath = findNearestNodeModules(__dirname); const sourcePath = path.join(nodeModulesPath, "./antd/dist/antd.css"); if (!fs.existsSync(sourcePath)) { throw new Error(`Source file not found: ${sourcePath}`); } let targetDirPath = path.join(nodeModulesPath, "@humansignal/editor/src/assets/styles"); if (!fs.existsSync(targetDirPath)) { if (fs.existsSync(path.join(__dirname, "../../libs/editor/src/assets/styles"))) { targetDirPath = path.join(__dirname, "../../libs/editor/src/assets/styles"); } } const targetPath = path.join(targetDirPath, "./antd-no-reset.css"); // Read the source file const sourceContent = fs.readFileSync(sourcePath, "utf8"); // Extract header and add our custom comments const header = `/*! * * antd v4.24.15 (without CSS reset) * * Copyright 2015-present, Alipay, Inc. * All rights reserved. * * Modified version to exclude global resets * */ /* stylelint-disable */ /* This is a modified version of antd.css that excludes global reset styles */ `; // These are CSS reset selectors we want to remove const resetSelectors = [ /^html,\s*body\s*{[\s\S]*?}/m, /^input::-ms-clear,\s*input::-ms-reveal\s*{[\s\S]*?}/m, /^\*,\s*\*::before,\s*\*::after\s*{[\s\S]*?}/m, /^html\s*{[\s\S]*?}/m, /^@-ms-viewport\s*{[\s\S]*?}/m, /^body\s*{[\s\S]*?}/m, /^\[tabindex='-1'\]:focus\s*{[\s\S]*?}/m, /^hr\s*{[\s\S]*?}/m, /^h1,\s*h2,\s*h3,\s*h4,\s*h5,\s*h6\s*{[\s\S]*?}/m, /^p\s*{[\s\S]*?}/m, /^abbr\[title\],\s*abbr\[data-original-title\]\s*{[\s\S]*?}/m, /^address\s*{[\s\S]*?}/m, /^input\[type='text'\],[\s\S]*?textarea\s*{[\s\S]*?}/m, /^ol,\s*ul,\s*dl\s*{[\s\S]*?}/m, /^ol ol,[\s\S]*?ul ol\s*{[\s\S]*?}/m, /^dt\s*{[\s\S]*?}/m, /^dd\s*{[\s\S]*?}/m, /^blockquote\s*{[\s\S]*?}/m, /^dfn\s*{[\s\S]*?}/m, /^b,\s*strong\s*{[\s\S]*?}/m, /^small\s*{[\s\S]*?}/m, /^sub,\s*sup\s*{[\s\S]*?}/m, /^sub\s*{[\s\S]*?}/m, /^sup\s*{[\s\S]*?}/m, /^a\s*{[\s\S]*?}/m, /^a:hover\s*{[\s\S]*?}/m, /^a:active\s*{[\s\S]*?}/m, /^a:active,\s*a:hover\s*{[\s\S]*?}/m, /^a:focus\s*{[\s\S]*?}/m, /^a\[disabled\]\s*{[\s\S]*?}/m, /^pre,\s*code,\s*kbd,\s*samp\s*{[\s\S]*?}/m, /^pre\s*{[\s\S]*?}/m, /^figure\s*{[\s\S]*?}/m, /^img\s*{[\s\S]*?}/m, /^a,\s*area,[\s\S]*?textarea\s*{[\s\S]*?}/m, /^table\s*{[\s\S]*?}/m, /^caption\s*{[\s\S]*?}/m, /^input,\s*button,[\s\S]*?textarea\s*{[\s\S]*?}/m, /^button,\s*input\s*{[\s\S]*?}/m, /^button,\s*select\s*{[\s\S]*?}/m, /^button,\s*html \[type="button"\],[\s\S]*?\[type="submit"\]\s*{[\s\S]*?}/m, /^button::-moz-focus-inner,[\s\S]*?\[type='submit'\]::-moz-focus-inner\s*{[\s\S]*?}/m, /^input\[type='radio'\],\s*input\[type='checkbox'\]\s*{[\s\S]*?}/m, /^input\[type='date'\],[\s\S]*?input\[type='month'\]\s*{[\s\S]*?}/m, /^textarea\s*{[\s\S]*?}/m, /^fieldset\s*{[\s\S]*?}/m, /^legend\s*{[\s\S]*?}/m, /^progress\s*{[\s\S]*?}/m, /^\[type='number'\]::-webkit-inner-spin-button,\s*\[type='number'\]::-webkit-outer-spin-button\s*{[\s\S]*?}/m, /^\[type='search'\]\s*{[\s\S]*?}/m, /^\[type='search'\]::-webkit-search-cancel-button,\s*\[type='search'\]::-webkit-search-decoration\s*{[\s\S]*?}/m, /^::-webkit-file-upload-button\s*{[\s\S]*?}/m, /^output\s*{[\s\S]*?}/m, /^summary\s*{[\s\S]*?}/m, /^template\s*{[\s\S]*?}/m, /^\[hidden\]\s*{[\s\S]*?}/m, /^mark\s*{[\s\S]*?}/m, /^::-moz-selection\s*{[\s\S]*?}/m, /^::selection\s*{[\s\S]*?}/m, ]; // Process the content let modifiedContent = sourceContent; // Remove reset selectors one by one resetSelectors.forEach((selector) => { modifiedContent = modifiedContent.replace(selector, ""); }); // Clean up multiple blank lines modifiedContent = modifiedContent.replace(/\n{3,}/g, "\n\n"); // Replace the original header with our custom header modifiedContent = modifiedContent.replace(/\/\*![\s\S]*?Alipay[\s\S]*?\*\//, header); // Remove any other stylelint-disable comments (except the one in our header) const headerEndPos = modifiedContent.indexOf("/* This is a modified version"); const contentAfterHeader = modifiedContent.substring(headerEndPos); const contentWithoutStylelintComments = contentAfterHeader.replace(/\/\* stylelint-disable[\s\S]*?\*\//g, ""); // Combine our header with the cleaned content modifiedContent = modifiedContent.substring(0, headerEndPos) + contentWithoutStylelintComments; // Clean up multiple blank lines again after removing comments modifiedContent = modifiedContent.replace(/\n{3,}/g, "\n\n"); // Write the result to the target file fs.writeFileSync(targetPath, modifiedContent, "utf8"); console.log("Generated antd-no-reset.css successfully!");