Zhengqbbb / cz-git

cz-git | czg πŸ› οΈ DX first and more engineered, lightweight, customizable, standard output format Commitizen adapter and CLI
https://cz-git.qbb.sh
MIT License
1.13k stars 41 forks source link

[Experiment Feature]: TypeScript config files support - Node.js v22 #192

Closed Mister-Hope closed 1 week ago

Mister-Hope commented 1 month ago

βœ… Checklist

πŸ“„ System Info

not needed

πŸ”Ž Description

See https://commitlint.js.org/reference/configuration.html

So https://cz-git.qbb.sh/config/#typescript-template should be fixed

πŸ”— Reproduction link / repo:

No response

Zhengqbbb commented 1 month ago

commitlint Replace ts-node with cosmiconfig-typescript-loader package https://github.com/conventional-changelog/commitlint/pull/3722

Although the speed has improved, The cosmiconfig-typescript-loader package added ,cz-git and czg will double the size, and I am still considering it. πŸ˜Άβ€πŸŒ«οΈ This makes me wonder the TypeScript support is important. If it's just type support, the issue #193 also can do this

image
Mister-Hope commented 1 month ago
  1. commitlint.config.ts is supported by commitlint directly, so the docs need to be corrected, there is nothing to do with your pacakge
  2. Even if you want to have cz.config.ts supported, you should externalize cosmiconfig-typescript-loader, tools like rollup and tsup can do that easily
Mister-Hope commented 1 month ago

Besides, I think you have misunderstood my original issue complaining about the deps number.

Since your package is strongly relying on commitlint, so you should try to reuse package that is required by it as much as possible while keeping the same major, this way you can externalize them safely as they are supposed to be installed to workspace anyway. (e.g.: cosmiconfig-typescript-loader)

The main target for tool package like this is trying to avoid requiring any new package that is heavy. A package is heavy means that it has too many deps or a lot of unused features for your usage. You can try to bundle packages with cz-git, only if they:

Zhengqbbb commented 1 month ago

Thank you for your reply.

  1. However, I don't understand with my documentation not supporting commitlint.config.ts Please feel free to point it out.

    Since your package is strongly relying on commitlint, so you should try to reuse package

  2. Like @commitlint/load package have too many dep package.json. I have try but cjs project treeshakable effect is not well
  3. Although I don't agree that a lightweight CLI tool, which requires the fastest startup speed (Include npx bunx usage), should resolve the ts configuration file at this time, I will keep an open opinion and will not add it in the short term.
Mister-Hope commented 1 month ago

However, I don't understand with my documentation not supporting commitlint.config.ts Please feel free to point it out.

image image

No offense, but as I am pointing out the link in issue body, it should not be hard to find these.

Zhengqbbb commented 1 month ago

Done Btw, I will try to configure loading for TypeScript using node > 22 LTS (2024-10-29), instead of adding extra dependencies.

Zhengqbbb commented 2 weeks ago

Hi there. Node.js LTS v22 has been released, and in v1.11.0, I will add the loading of ESM configuration and TS configuration. Regarding the loading of TS configuration, it is using the native Node loading method, but it is currently an experimental feature that requires additional environment injection. Recommended to first use the ESM JS method for transition.

Docs preview: https://deploy-preview-197--cz-git.netlify.app/


I have released a next pre-release version 🌟(v1.11.0-beta.1)🌟 for testing. I expect to officially release v1.11.0 next weekend. Welcome to try it out! πŸ‘€ Let me know if there are still any issues. πŸŽ‰


I am testing in the repository https://github.com/vuepress-theme-hope/vuepress-theme-hope

Suggestion (ESM js)

  1. rename commitlint.config.ts => commitlint.config.js
import { execSync } from "node:child_process";
import { readdirSync } from "node:fs";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";

import { defineConfig } from "cz-git";

const packages = readdirSync(
  join(dirname(fileURLToPath(import.meta.url)), "./packages/"),
);

const scopeComplete = execSync("git status --porcelain || true")
  .toString()
  .trim()
  .split("\n")
  .find((r) => ~r.indexOf("M  packages"))
  ?.replace(/\//g, "%%")
  ?.match(/packages%%((\w|-)*)/)?.[1];

export default defineConfig({
  extends: ["@commitlint/config-conventional"],
  rules: {
    "scope-enum": [2, "always", ["demo", "release", ...packages]],
  },
  prompt: {
    defaultScope: scopeComplete,
    customScopesAlign: !scopeComplete ? "top" : "bottom",
    allowCustomIssuePrefix: false,
    allowEmptyIssuePrefix: false,
  },
});

CleanShot 2024-11-01 at 21 51 25@2x

(TypeScript configure)

-     "commit": "pnpm git-cz",
+     "commit": "cross-env NODE_OPTIONS=\"--experimental-transform-types --disable-warning ExperimentalWarning\" pnpm git-cz",

CleanShot 2024-11-01 at 21 53 34@2x

Zhengqbbb commented 1 week ago

The latest version 🌟(v1.11.0)🌟 released and can use Node v22 to loading ts configure, But it is recommended to use ESM js configure as a transition for the future TypeScript configuration file, and switch to it after Node.js runs TypeScript stably.

Docs Link: https://cz-git.qbb.sh/config/#typescript-template