mirror of
https://github.com/webstudio-is/webstudio.git
synced 2026-11-05 19:49:57 +09:00
## Description We allow console.info (btw we should also allow warn/error/info), we only disallow console.log in the linter because that's what we use for debugging. ## Steps for reproduction 1. click button 2. expect xyz ## Code Review - [ ] hi @TrySound , I need you to do - conceptual review (architecture, feature-correctness) - detailed review (read every line) - test it on preview ## Before requesting a review - [ ] made a self-review - [ ] added inline comments where things may be not obvious (the "why", not "what") ## Before merging - [ ] tested locally and on preview environment (preview dev login: 5de6) - [ ] updated [test cases](https://github.com/webstudio-is/webstudio/blob/main/apps/builder/docs/test-cases.md) document - [ ] added tests - [ ] if any new env variables are added, added them to `.env.example` and the `builder/env-check.js` if mandatory
269 lines
5.3 KiB
TypeScript
269 lines
5.3 KiB
TypeScript
/**
|
|
* To run it go to the root: $ pnpm tsx ./codemod/migrate-spacing.ts
|
|
*/
|
|
import fs from "fs/promises";
|
|
import path from "path";
|
|
|
|
const getRecursiveFileReads = async (dir: string) => {
|
|
const results: any = [];
|
|
const files = await fs.readdir(dir);
|
|
for (const file of files) {
|
|
const filePath = path.join(dir, file);
|
|
const stat = await fs.stat(filePath);
|
|
if (stat.isDirectory() && file !== "node_modules") {
|
|
results.push(...(await getRecursiveFileReads(filePath)));
|
|
continue;
|
|
}
|
|
|
|
if (path.extname(file) !== ".tsx" && path.extname(file) !== ".ts") {
|
|
continue;
|
|
}
|
|
|
|
const buffer = await fs.readFile(filePath);
|
|
|
|
results.push({
|
|
filePath,
|
|
buffer,
|
|
});
|
|
}
|
|
return results;
|
|
};
|
|
|
|
const readDirectory = async (dir: string) => {
|
|
const results = await getRecursiveFileReads(dir);
|
|
console.info(results.length);
|
|
return results;
|
|
};
|
|
|
|
const spaceProps = [
|
|
"size",
|
|
"sizes",
|
|
"blockSize",
|
|
"minBlockSize",
|
|
"maxBlockSize",
|
|
"inlineSize",
|
|
"minInlineSize",
|
|
"maxInlineSize",
|
|
"width",
|
|
"minWidth",
|
|
"maxWidth",
|
|
"height",
|
|
"minHeight",
|
|
"maxHeight",
|
|
"flexBasis",
|
|
"gridTemplateColumns",
|
|
"gridTemplateRows",
|
|
|
|
"gap",
|
|
"gridGap",
|
|
"columnGap",
|
|
"gridColumnGap",
|
|
"rowGap",
|
|
"gridRowGap",
|
|
"inset",
|
|
"insetBlock",
|
|
"insetBlockEnd",
|
|
"insetBlockStart",
|
|
"insetInline",
|
|
"insetInlineEnd",
|
|
"insetInlineStart",
|
|
"margin",
|
|
"marginTop",
|
|
"marginRight",
|
|
"marginBottom",
|
|
"marginLeft",
|
|
"marginBlock",
|
|
"marginBlockEnd",
|
|
"marginBlockStart",
|
|
"marginInline",
|
|
"marginInlineEnd",
|
|
"marginInlineStart",
|
|
"padding",
|
|
"paddingTop",
|
|
"paddingRight",
|
|
"paddingBottom",
|
|
"paddingLeft",
|
|
"paddingBlock",
|
|
"paddingBlockEnd",
|
|
"paddingBlockStart",
|
|
"paddingInline",
|
|
"paddingInlineEnd",
|
|
"paddingInlineStart",
|
|
"top",
|
|
"right",
|
|
"bottom",
|
|
"left",
|
|
"scrollMargin",
|
|
"scrollMarginTop",
|
|
"scrollMarginRight",
|
|
"scrollMarginBottom",
|
|
"scrollMarginLeft",
|
|
"scrollMarginX",
|
|
"scrollMarginY",
|
|
"scrollMarginBlock",
|
|
"scrollMarginBlockEnd",
|
|
"scrollMarginBlockStart",
|
|
"scrollMarginInline",
|
|
"scrollMarginInlineEnd",
|
|
"scrollMarginInlineStart",
|
|
"scrollPadding",
|
|
"scrollPaddingTop",
|
|
"scrollPaddingRight",
|
|
"scrollPaddingBottom",
|
|
"scrollPaddingLeft",
|
|
"scrollPaddingX",
|
|
"scrollPaddingY",
|
|
"scrollPaddingBlock",
|
|
"scrollPaddingBlockEnd",
|
|
"scrollPaddingBlockStart",
|
|
"scrollPaddingInline",
|
|
"scrollPaddingInlineEnd",
|
|
"scrollPaddingInlineStart",
|
|
|
|
"mx",
|
|
"my",
|
|
"ml",
|
|
"mb",
|
|
"mr",
|
|
"mt",
|
|
"m",
|
|
"px",
|
|
"py",
|
|
"pl",
|
|
"pb",
|
|
"pr",
|
|
"pt",
|
|
"p",
|
|
];
|
|
|
|
const spaceValues = new Map([
|
|
["$sizes$1", "3"],
|
|
["$sizes$2", "5"],
|
|
["$sizes$3", "9"],
|
|
["$sizes$4", "10"],
|
|
["$sizes$5", "11"],
|
|
["$sizes$6", "13"],
|
|
["$sizes$7", "17"],
|
|
["$sizes$8", "19"],
|
|
["$sizes$9", "20"],
|
|
["$space$1", "3"],
|
|
["$space$2", "5"],
|
|
["$space$3", "9"],
|
|
["$space$4", "10"],
|
|
["$space$5", "11"],
|
|
["$space$6", "13"],
|
|
["$space$7", "17"],
|
|
["$space$8", "19"],
|
|
["$space$9", "20"],
|
|
["$styleSection", "5"],
|
|
["$sidebarLeft", "16"],
|
|
["$sidebarRight", "30"],
|
|
|
|
["$1", "3"],
|
|
["$2", "5"],
|
|
["$3", "9"],
|
|
["$4", "10"],
|
|
["$5", "11"],
|
|
["$6", "13"],
|
|
["$7", "17"],
|
|
["$8", "19"],
|
|
["$9", "20"],
|
|
|
|
["1px", "1"],
|
|
["2px", "2"],
|
|
["3px", "2"],
|
|
["6px", "4"],
|
|
["7px", "4"],
|
|
["8px", "5"],
|
|
]);
|
|
|
|
const fontSizeProps = ["fontSize"];
|
|
const fontSizeValues = new Map([
|
|
["$1", "3"],
|
|
["$2", "3"],
|
|
["$3", "4"],
|
|
["$4", "4"],
|
|
["$5", "5"],
|
|
["$6", "6"],
|
|
["$7", "7"],
|
|
["$8", "8"],
|
|
["$9", "9"],
|
|
["14px", "4"],
|
|
]);
|
|
|
|
const lineHeightProps = ["lineHeight"];
|
|
const lineHeightValues = new Map([
|
|
["15px", "3"],
|
|
["16px", "3"],
|
|
["20px", "4"],
|
|
]);
|
|
|
|
const borderRadiusProps = ["borderRadius"];
|
|
const borderRadiusValues = new Map([
|
|
["$1", "4"],
|
|
["$2", "6"],
|
|
["$3", "7"],
|
|
["$round", "round"],
|
|
["$pill", "pill"],
|
|
]);
|
|
|
|
const updateProperty = (
|
|
line: string,
|
|
props: Array<string>,
|
|
values: Map<string, string>,
|
|
group: string
|
|
) => {
|
|
for (const prop of props) {
|
|
const regex = new RegExp(`${prop}: "(.+)"`, "g");
|
|
const match = regex.exec(line);
|
|
if (match && match[1]) {
|
|
let value = match[1];
|
|
for (const [key, nextValue] of values) {
|
|
if (value.includes(key) === false) continue;
|
|
// This is to allow the script to run multiple times
|
|
value = value.replaceAll(`$${group}$`, `__${group}__`);
|
|
|
|
value = value.replaceAll(key, `__${group}__${nextValue}`);
|
|
}
|
|
|
|
const next = `${prop}: "${value}"`;
|
|
line = line.replace(regex, next);
|
|
}
|
|
}
|
|
line = line.replaceAll(`__${group}__`, `$${group}$`);
|
|
return line;
|
|
};
|
|
|
|
const update = async ({ filePath, buffer }) => {
|
|
let code = buffer.toString("utf-8");
|
|
const lines = code.split("\n");
|
|
const nextLines: Array<string> = [];
|
|
let line: string = "";
|
|
for (line of lines) {
|
|
line = updateProperty(line, spaceProps, spaceValues, "spacing");
|
|
line = updateProperty(line, fontSizeProps, fontSizeValues, "fontSize");
|
|
line = updateProperty(
|
|
line,
|
|
lineHeightProps,
|
|
lineHeightValues,
|
|
"lineHeight"
|
|
);
|
|
line = updateProperty(
|
|
line,
|
|
borderRadiusProps,
|
|
borderRadiusValues,
|
|
"borderRadius"
|
|
);
|
|
nextLines.push(line);
|
|
}
|
|
await fs.writeFile(filePath, nextLines.join("\n"));
|
|
};
|
|
|
|
const main = async () => {
|
|
const src = path.resolve(__dirname, "..");
|
|
const files = await readDirectory(src);
|
|
files.forEach(update);
|
|
};
|
|
|
|
main();
|