An open API service indexing awesome lists of open source software.

https://github.com/ozum/create-tsm

Highly opinionated and customizable boilerplate for creating and updating TypeScript modules.
https://github.com/ozum/create-tsm

Last synced: about 2 months ago
JSON representation

Highly opinionated and customizable boilerplate for creating and updating TypeScript modules.

Awesome Lists containing this project

README

        

# Description

Highly opinionated and customizable boilerplate for creating and **updating** TypeScript modules.

No need to install anything. Just use your package manager.

Creates your project and provides automatic verification, push, and release scripts.

# Usage

## Create

```sh
$ mkdir my-project
$ NPM_TOKEN=xyz123 GITHUB_TOKEN=xyz123 npm init @ozum/tsm@latest
```

It will ask your package manager. You can select **`npm`, `pnpm`, or `yarn`** even if you started the script with `npm init`.

## Update (Experimental)

```sh
$ npx @ozum/create-tsm@latest
```

- Updates `package.json` dependencies and base scripts starting with `base:`.
- Updates files in `.husky` and `config/tsm`.
- Adds new configs to the root if any are available.
- Does **NOT** change/update configs in the root directory.
- Does **NOT** change/update GitHub workflows.

# Features

- Supports **`npm`, `pnpm` and `yarn`**.
- Creates `package.json` with necessary `devDependencies` and development-related `scripts`.
- Allows you to use up-to-date [shared GitHub workflow](https://github.com/ozum/create-tsm/blob/main/.github/workflows/base-build-and-test.yml) or the workflow at the time of initialization. (Based on the answer to the `use shared GitHub workflow` question)
- Updates existing `package.json`, base configurations, and base scripts. Does not touch derived scripts and configurations.
- Writes `package.json` if only it is changed.
- Executes `install` if only dependencies have changed.
- Creates `package.json` scripts prefixed with `base:`, so you can customize yours without risking future updates.
- Where possible, creates base scripts in the `config/tsm` directory, so you can customize yours without risking future updates.
- Provides [reusable GitHub workflow](https://docs.github.com/en/actions/using-workflows/reusing-workflows).
- **(Optional)** Creates a GitHub repository.
- **(Optional)** Adds `NPM_TOKEN` secret to the created repository.
- Never stores the security tokens.
- Creates a GitHub workflow for CI/CD which utilizes [`Semantic Release`](https://semantic-release.gitbook.io/semantic-release/)
- Let's GitHub Workflow verify (test, lint, build, audit) and publish the npm package.
- Has stringent ESLint rules but can be customized.
- Configures and supports many tools out of the box. No configs are needed.
- [ESLint](https://eslint.org/) with three configurations. (`ozum`, `ozum-minimum`, `ozum-maximum`). See [eslint-config-ozum](https://www.npmjs.com/package/eslint-config-ozum)
- [Prettier](https://prettier.io/)
- [EditorConfig](https://editorconfig.org/)
- [Commitizen](http://commitizen.github.io/cz-cli/)
- [commitlint](https://commitlint.js.org/)
- [Jest](https://jestjs.io/)
- [Knip](https://github.com/webpro/knip)
- [Lint Staged](https://github.com/okonet/lint-staged)
- [TypeDoc](https://typedoc.org/)
- [GitHub Actions](https://docs.github.com/en/actions)
- [Husky](https://typicode.github.io/husky/)
- [swpm](https://github.com/deinsoftware/swpm)
- [semantic-release](https://semantic-release.gitbook.io/semantic-release)
- Generates LICENSE file.

## Scripts

Below are the `package.json` scripts generated and their default behavior. Do not change the scripts starting with **`base:`** because this tool will overwrite them during the update.

| name | EU | description |
| ---------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| verify | :smiley: | Tests and check lint, audit, format, and dependencies of the project. |
| release | :smiley: |


  • Verifies your project

  • Commits & pushes the project to the GitHub

  • Ensures your commit message is [conventional](https://www.conventionalcommits.org/)

  • Lets GitHub CI/CD release your package to the NPM with correct version number using [semantic-release](https://semantic-release.gitbook.io/semantic-release)
  • |
    | test | :smiley: | Tests the project. |
    | dev | :question: | Starts build process in `watch` mode. |
    | lint | :question: | Lints and fixes errors when possible. |
    | format | :question: | Formats the files. |
    | build | :question: | Builds your project. |
    | docs:api | :question: | Builds API docs with [TypeDoc](https://typedoc.org/). |
    | commit | :heavy_exclamation_mark: | Executes `git commit` with [Commitizen](http://commitizen.github.io/cz-cli/), but you don't need to use it, because [Husky](https://typicode.github.io/husky/) catches `git commit`. |
    | commitlint | :heavy_exclamation_mark: | Executes tasks for [commitlint](https://commitlint.js.org/). |
    | precommit | :heavy_exclamation_mark: | Executes [Lint Staged](https://github.com/okonet/lint-staged) tasks and verifications. |
    | prepare | :heavy_exclamation_mark: | Ensures [Husky](https://typicode.github.io/husky/) is installed. |


    | Legend | Purpose | Description |
    | ------------------------ | -------------- | --------------------------------------------------------------------------------- |
    | :smiley: | For end user | Should be used by the end user in a normal workflow. |
    | :question: | Occasional use | Used by end user occasionally when needed. |
    | :heavy_exclamation_mark: | Special need | Normally not used by end user. Only needed for customization or special purposes. |

    ## What about Monorepo?

    [TurboRepo](https://turbo.build/repo) is an excellent monorepo tool and easy to learn and start.

    I suggest deleting the created GitHub Action file because `Semantic Release` does not support monorepos.

    I examined several tools but couldn't find an **easy** way to publish multiple packages using `Semantic Release` with mono repos.

    I'm open to suggestions for monorepo support if the solution is

    - Easy to setup for end users
    - Easy to maintain for end users
    - Unobtrusive
    - Robust
    - Widely supported

    # (Optional) GitHub Access Token Permissions

    Optionally, this boilerplate can create a GitHub repository and add the `NPM_TOKEN` secret. I advise creating fine-grained personal access tokens for increased security to limit actions. You can create fine-grained access tokens [here](https://github.com/settings/personal-access-tokens/new).

    - Administration: Read and write (To create a GitHub repository)
    - Metadata: Read-only (Mandated by GitHub)
    - Secrets: Read and write (This is **OPTIONAL** and used to add `NPM_TOKEN`)

    # FAQ

    **Q:** How to customize `package.json` scripts?

    **A:** There are `base` and `normal` scripts. Add your custom tasks to the normal scripts without changing the `base:` scripts. For example: `{ "verify": "my-task && swpm run base:verify" }`

    **Q:** How to change or remove coverage thresholds of the tests?

    **A:** Add `jest.config.js` the following: ` coverageThreshold: { global: { branches: 0, functions: 0, lines: 0, statements: 0 } }`

    **Q:** How to turn off tests?

    **A:** Change `test` script in `package.json` as similar to `{ "test": "echo No tests are available. Skipping testing step." }`