From a14e422961247f301d4ba6e234738229790903db Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Sat, 24 Dec 2022 23:05:04 -0800 Subject: [PATCH] Integrate clang-format into JS lint steps --- .github/actions/clang-format/action.yml | 4 +- .github/workflows/validate-cpp.yml | 5 - javascript/.eslintrc.js | 2 +- javascript/just.config.js | 143 ++++++++++++++++-------- javascript/package.json | 5 +- javascript/src_native/embind.cc | 6 +- javascript/yarn.lock | 18 ++- 7 files changed, 121 insertions(+), 62 deletions(-) diff --git a/.github/actions/clang-format/action.yml b/.github/actions/clang-format/action.yml index 79508a14..8d9a57a3 100644 --- a/.github/actions/clang-format/action.yml +++ b/.github/actions/clang-format/action.yml @@ -19,6 +19,6 @@ runs: working-directory: ${{ inputs.directory }} shell: bash run: | - shopt -s globstar + shopt -s extglob shopt -s nullglob - clang-format-${{ inputs.version }} --dry-run --Werror **/*.cpp **/*.cc **/*.h **/*.hh **/*.m **/*.mm + clang-format-${{ inputs.version }} --dry-run --Werror **/*.{h,hh,hpp,c,cpp,cc,m,mm} diff --git a/.github/workflows/validate-cpp.yml b/.github/workflows/validate-cpp.yml index 121bdb41..3f4b4e7a 100644 --- a/.github/workflows/validate-cpp.yml +++ b/.github/workflows/validate-cpp.yml @@ -19,8 +19,3 @@ jobs: uses: ./.github/actions/clang-format with: directory: ./yoga - - - name: clang-format (JavaScript Bindings) - uses: ./.github/actions/clang-format - with: - directory: ./javascript diff --git a/javascript/.eslintrc.js b/javascript/.eslintrc.js index 76439d7c..6cedc194 100644 --- a/javascript/.eslintrc.js +++ b/javascript/.eslintrc.js @@ -8,7 +8,7 @@ */ module.exports = { - ignorePatterns: ["dist/**"], + ignorePatterns: ["dist/**", "**/*.d.ts"], parser: "@babel/eslint-parser", extends: [ "eslint:recommended", diff --git a/javascript/just.config.js b/javascript/just.config.js index 424717fa..b221a090 100644 --- a/javascript/just.config.js +++ b/javascript/just.config.js @@ -8,82 +8,58 @@ */ const { + argv, copyTask, + eslintTask, + logger, jestTask, + option, parallel, series, spawn, task, } = require("just-scripts"); + const glob = require("glob"); const which = require("which"); -const cmake = which.sync("cmake"); -const emcmake = which.sync("emcmake"); -const ninja = which.sync("ninja", { nothrow: true }); -const node = which.sync("node"); -const npx = which.sync("npx"); +const node = process.execPath; -task("copy-dts", copyTask({ paths: ["./src_js/**/*.d.ts"], dest: "./dist" })); +option("fix"); -task("babel", () => - spawn(npx, ["babel", "src_js", "--source-maps", "--out-dir", "dist"]) +task( + "prepare-for-build", + parallel( + babelTransformTask({ paths: ["src_js"], dest: "dist" }), + copyTask({ paths: ["src_js/**/*.d.ts"], dest: "dist" }), + emcmakeGenerateTask() + ) ); -task("cmake-generate", () => - spawn(emcmake, [ - "cmake", - "-S", - ".", - "-B", - "build", - ...(ninja ? ["-G", "Ninja"] : []), - ]) -); - -function prepareTask() { - return parallel("cmake-generate", "copy-dts", "babel"); -} - -function runBenchTask() { - const files = glob.sync("./tests/Benchmarks/**/*.js"); - return () => - spawn(node, ["./tests/run-bench.js", ...files], { stdio: "inherit" }); -} - -function cmakeBuildTask(targets) { - return () => - spawn( - cmake, - ["--build", "build", ...(targets ? ["--target", ...targets] : [])], - { stdio: "inherit" } - ); -} - -function buildFlavor(flavor, env) { +function defineFlavor(flavor, env) { task(`cmake-build:${flavor}`, cmakeBuildTask([flavor])); task(`jest:${flavor}`, jestTask({ env })); task( `test:${flavor}`, - series(prepareTask(), `cmake-build:${flavor}`, `jest:${flavor}`) + series("prepare-for-build", `cmake-build:${flavor}`, `jest:${flavor}`) ); } -buildFlavor("asmjs-async", { WASM: 0, SYNC: 0 }); -buildFlavor("asmjs-sync", { WASM: 0, SYNC: 1 }); -buildFlavor("wasm-async", { WASM: 1, SYNC: 0 }); -buildFlavor("wasm-sync", { WASM: 1, SYNC: 1 }); +defineFlavor("asmjs-async", { WASM: 0, SYNC: 0 }); +defineFlavor("asmjs-sync", { WASM: 0, SYNC: 1 }); +defineFlavor("wasm-async", { WASM: 1, SYNC: 0 }); +defineFlavor("wasm-sync", { WASM: 1, SYNC: 1 }); task("cmake-build:all", cmakeBuildTask()); task("cmake-build:async", cmakeBuildTask(["asmjs-async", "wasm-async"])); task("cmake-build:sync", cmakeBuildTask(["asmjs-sync", "wasm-sync"])); -task("build", series(prepareTask(), "cmake-build:all")); +task("build", series("prepare-for-build", "cmake-build:all")); task( "test", series( - prepareTask(), + "prepare-for-build", series("cmake-build:asmjs-async", "jest:asmjs-async"), series("cmake-build:asmjs-sync", "jest:asmjs-sync"), series("cmake-build:wasm-async", "jest:wasm-async"), @@ -91,4 +67,77 @@ task( ) ); -task("benchmark", series(prepareTask(), "cmake-build:sync", runBenchTask())); +task( + "benchmark", + series("prepare-for-build", "cmake-build:sync", runBenchTask()) +); + +task( + "lint", + series(eslintTask({ fix: argv().fix }), clangFormatTask({ fix: argv().fix })) +); + +function babelTransformTask(opts) { + return () => { + const args = [...opts.paths, "--source-maps", "--out-dir", opts.dest]; + logger.info(`Transforming [${opts.paths.join(",")}] to '${opts.dest}'`); + + return spawn(node, [require.resolve("@babel/cli/bin/babel"), ...args]); + }; +} + +function runBenchTask() { + return () => { + const files = glob.sync("./tests/Benchmarks/**/*.js"); + const args = ["./tests/run-bench.js", ...files]; + logger.info(args.join(" ")); + + return spawn(node, args, { stdio: "inherit" }); + }; +} + +function emcmakeGenerateTask() { + return () => { + const emcmake = which.sync("emcmake"); + const ninja = which.sync("ninja", { nothrow: true }); + const args = [ + "cmake", + "-S", + ".", + "-B", + "build", + ...(ninja ? ["-G", "Ninja"] : []), + ]; + logger.info(["encmake", ...args].join(" ")); + + return spawn(emcmake, args); + }; +} + +function cmakeBuildTask(targets) { + return () => { + const cmake = which.sync("cmake"); + const args = [ + "--build", + "build", + ...(targets ? ["--target", ...targets] : []), + ]; + logger.info(["cmake", ...args].join(" ")); + + return spawn(cmake, args, { stdio: "inherit" }); + }; +} + +function clangFormatTask(opts) { + return () => { + const args = [ + ...(opts.fix ? ["-i"] : ["--dry-run", "--Werror"]), + ...glob.sync("**/*.{h,hh,hpp,c,cpp,cc,m,mm}"), + ]; + logger.info(["clang-format", ...args].join(" ")); + + return spawn(node, [require.resolve("clang-format"), ...args], { + stdio: "inherit", + }); + }; +} diff --git a/javascript/package.json b/javascript/package.json index 07bf3398..201542f2 100644 --- a/javascript/package.json +++ b/javascript/package.json @@ -28,8 +28,8 @@ "scripts": { "benchmark": "just benchmark", "build": "just build", - "lint": "eslint .", - "lint:fix": "yarn lint --fix", + "lint": "just lint", + "lint:fix": "just lint --fix", "test": "just test", "test:asmjs-async": "just test:asmjs-async", "test:asmjs-sync": "just test:asmjs-sync", @@ -41,6 +41,7 @@ "@babel/core": "^7.20.7", "@babel/eslint-parser": "^7.19.1", "@babel/preset-env": "^7.20.2", + "clang-format": "^1.8.0", "eslint": "^8.30.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-jest": "^27.1.7", diff --git a/javascript/src_native/embind.cc b/javascript/src_native/embind.cc index cb5d8056..91e6afc3 100644 --- a/javascript/src_native/embind.cc +++ b/javascript/src_native/embind.cc @@ -32,11 +32,11 @@ EMSCRIPTEN_BINDINGS(YOGA_LAYOUT) { "setExperimentalFeatureEnabled", &Config::setExperimentalFeatureEnabled) .function("setPointScaleFactor", &Config::setPointScaleFactor) - .function("setUseLegacyStretchBehaviour", &Config::setUseLegacyStretchBehaviour) + .function( + "setUseLegacyStretchBehaviour", &Config::setUseLegacyStretchBehaviour) .function("setUseWebDefaults", &Config::setUseWebDefaults) .function( - "isExperimentalFeatureEnabled", - &Config::isExperimentalFeatureEnabled) + "isExperimentalFeatureEnabled", &Config::isExperimentalFeatureEnabled) .function("useLegacyStretchBehaviour", &Config::useLegacyStretchBehaviour) .function("useWebDefaults", &Config::useWebDefaults); diff --git a/javascript/yarn.lock b/javascript/yarn.lock index 96c8c1c9..0cfd027e 100644 --- a/javascript/yarn.lock +++ b/javascript/yarn.lock @@ -1628,6 +1628,11 @@ async-settle@^2.0.0: dependencies: async-done "^2.0.0" +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + babel-jest@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" @@ -1870,6 +1875,15 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +clang-format@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/clang-format/-/clang-format-1.8.0.tgz#7779df1c5ce1bc8aac1b0b02b4e479191ef21d46" + integrity sha512-pK8gzfu55/lHzIpQ1givIbWfn3eXnU7SfxqIwVgnn5jEM6j4ZJYjpFqFs4iSBPNedzRMmfjYjuQhu657WAXHXw== + dependencies: + async "^3.2.3" + glob "^7.0.0" + resolve "^1.1.6" + cli-table3@^0.6.0: version "0.6.3" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" @@ -2506,7 +2520,7 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -3798,7 +3812,7 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0: +resolve@^1.1.6, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==