2020-05-14 00:47:15 +02:00
< p align = "center" >
2020-05-15 22:51:31 +02:00
< img src = "https://user-images.githubusercontent.com/6702424/82094662-cd17c200-96fd-11ea-8645-808344bad951.png" >
2020-05-14 00:47:15 +02:00
< / p >
< p align = "center" >
2020-05-15 22:51:31 +02:00
< i > A template to assist you in creating and publishing TypeScript modules.< / i >
2020-05-14 00:47:15 +02:00
< br >
< br >
< / p >
---
2020-05-16 18:56:31 +02:00
2020-05-15 22:51:31 +02:00
# Presentation
2020-05-14 00:47:15 +02:00
2020-05-16 19:07:19 +02:00
This template automates the boring and tedious tasks of:
2020-05-15 22:51:31 +02:00
- Filling up the ``package.json` `
- Setting up Typescript.
- Writing a [README.md ](https://github.com/garronej/denoify_ci/blob/dev/README.template.md ) with decent presentation and instructions on how to install/import your module.
2020-05-17 20:02:43 +02:00
- Testing on multiple Node version before publishing.
2020-05-15 22:51:31 +02:00
- Maintaining a CHANGELOG.
2020-05-15 22:57:11 +02:00
- Publishing on NPM and creating corresponding GitHub releases.
2020-05-15 22:51:31 +02:00
2020-05-16 19:07:19 +02:00
Besides, good stuff that comes with using this template:
2020-05-17 20:05:54 +02:00
- No source files are tracked on the ``master` ` branch.
2020-05-15 22:51:31 +02:00
- Shorter specific file import path.
``import {...} from "my_module/theFile"` ` instead of the usual
``import {...} from "my_module/dist/theFile"` `
- CDN distribution for importing from an ``.html`` file with a ``<script>` ` tag.
2020-05-15 22:57:11 +02:00
- A branch ``latest` ` always in sync with the latest release.
2020-05-15 22:51:31 +02:00
2020-05-17 20:02:43 +02:00
# Important notices
- You probably want to "Use this template" ( the green button ) instead of forking the repo.
- The files to include in the NPM bundle are cherry-picked using the ``package.json`` ``files` ` field.
If you don't want to bother and includes everything just remove the ``files`` field from the ``package.json` `
otherwise remember, when you add a subdirectory in ``src/``, to update the ``package.json`` ``files` `.
- If you are going to programmatically load files outside of the ``dis/`` directory ( like the ``package.json`` or files inside ``res/` ` ) be mindful that the paths might not be the one you expect. [Details ](#accessing-files-outside-the-dist-directory ).
2020-05-15 22:51:31 +02:00
# How to use
## Fork it ( click use the template )
- Click on *Use this template*
2020-05-16 19:07:19 +02:00
- The repo name you will choose will be used as a module name for NPM so:
2020-05-16 18:56:31 +02:00
- Be sure it makes for a valid NPM module name.
- Check if there is not already a NPM module named like that.
- The description you provide will be the one used on NPM and in ``package.json` ` ( you can change it later )
2020-05-15 22:51:31 +02:00
2020-05-16 19:07:19 +02:00
Once you've done that a GitHub action workflow will set up the ``README.md`` and the ``package.json` ` for you, wait a couple of minutes for it to complete ( a bot will push ). You can follow the job advancement in the "Action" tab.
2020-05-15 22:51:31 +02:00
2020-05-17 20:02:43 +02:00
Each time you will push changes ``npm test`` will be run on remote docker containers against multiple node versions if everything passes you will get a green ``ci` ` badges in your readme.
2020-05-15 22:51:31 +02:00
2020-05-17 20:02:43 +02:00
## Enable automatic publishing
2020-05-15 22:51:31 +02:00
2020-05-16 18:56:31 +02:00
Once you are ready to make your package available on NPM you
will need to provide two tokens so that the workflow can publish on your behalf:
2020-05-15 22:51:31 +02:00
Go to repository ``Settings`` tab, then ``Secrets` ` you will need to add two new secrets:
- ``NPM_TOKEN` `, you NPM authorization token.
- ``PAT` `, GitHub **P**ersonal **A**ccess **T**oken with the **repo** authorization. [link ](https://github.com/settings/tokens )
To trigger publishing edit the ``package.json`` ``version`` field ( ``0.0.0``-> ``0.0.1` ` for example) then push changes... that's all !
2020-05-16 18:56:31 +02:00
The publishing will actually be performed only if ``npm test` ` passes.
2020-05-15 22:51:31 +02:00
2020-05-16 19:07:19 +02:00
# Customization:
2020-05-15 22:51:31 +02:00
## Changing the directory structures.
2020-05-16 19:07:19 +02:00
All your source files must remain inside the ``src` ` dir, you can change how things are organized
2020-05-15 22:51:31 +02:00
but don't forget to update your ``package.json`` ``main``, ``type`` and ``files`` fields and ``tsconfig.esm.json`` ``include` ` field when appropriate!
2020-05-16 19:07:19 +02:00
## Swipe the image in the ``README.md``
2020-05-15 22:51:31 +02:00
2020-05-16 19:07:19 +02:00
A good way to host your repo image is to open an issue named ASSET in your project, close it, create a comment, drag and drop the picture you want to use and that's it. You have a link that you can replace in the ``README.md` `.
2020-05-15 22:51:31 +02:00
While you are at it submit this image as *social preview* in your repos github page's settings so that when you share on
2020-05-17 20:02:43 +02:00
Twitter or Reddit you don't get your GitHub profile picture to show up.
2020-05-15 22:51:31 +02:00
## Disable CDN build
If your project does not target the browser or if you are not interested in offering CDN distribution:
- Remove all ``cdn:*`` npm scripts and ``npm run cdn`` from the ` build` script ( in ``package.json` ` ).
- Remove ``./tsconfig.esm.json` `
- Remove ``/dist/esm/`` entry from ``files`` in ``package.json` `
- Remove ``simplifyify`` and ``terser` ` from dev dependencies.
2020-05-17 20:02:43 +02:00
## Remove unwanted dev dependencies
2020-05-15 22:51:31 +02:00
2020-05-16 19:07:19 +02:00
Dev dependencies that are not required by the template ( you can safely remove them if you don't use them ):
2020-05-15 22:51:31 +02:00
- ``evt` `
- ``@types/node` `
2020-05-17 20:02:43 +02:00
Must keep:
2020-05-15 22:51:31 +02:00
- ``typescript` `
- ``denoify` ` ( for the script that moves dist files to the root before publishing )
- ``simplifyify` ` ( for CDN build )
- ``terser` ` ( for CDN build )
2020-05-15 23:06:13 +02:00
## Customizing the Badges
2020-05-17 20:02:43 +02:00
You can use [shields.io ](https://shields.io ) to create badges on metrics you would like to showcase.
# Accessing files outside the ``dist/`` directory
2020-05-15 22:51:31 +02:00
- The template does not support ``.npmignore`` use ``package.json`` ``files` ` instead.
- The template does not support ``.npmrc` `
The drawback of having short import path is that the dir structure
is not exactly the same in production ( in the npm bundle ) and in development.
The files and directories in ``dist/` ` will be moved to the root of the project.
As a result this won't work in production:
``src/index.ts` `
2020-05-14 00:47:15 +02:00
```typescript
2020-05-15 22:51:31 +02:00
import * as fs from "fs";
import * as path from "path";
const str = fs.readFileSync(
path.join(__filename,"..", "package.json")
).toString("utf8");
2020-05-14 00:47:15 +02:00
```
2020-05-15 22:51:31 +02:00
Because ``/dist/index.js`` will be moved to ``/index.js` `
2020-05-14 00:47:15 +02:00
2020-05-15 22:51:31 +02:00
You'll have to do:
2020-05-14 00:47:15 +02:00
2020-05-15 22:51:31 +02:00
``src/index.ts` `
```typescript
import * as fs from "fs";
import * as path from "path";
import { getProjectRoot } from "./tools/getProjectRoot";
2020-05-14 00:47:15 +02:00
2020-05-15 22:51:31 +02:00
const str = fs.readFileSync(
path.join(getProjectRoot(),"package.json")
).toString("utf8");
```
2020-05-14 00:47:15 +02:00
2020-05-16 12:27:26 +02:00
# Video demo
[](https://youtu.be/Q5t-yP2PvPA)
2020-05-16 19:07:19 +02:00
# Examples of auto-generated readme:
2020-05-16 13:53:39 +02:00

2020-05-15 22:51:31 +02:00
2020-05-17 20:04:08 +02:00
# Creating a documentation website for your project:
I recommend [GitBook ](https://www.gitbook.com ), It enables you to write your documentation in markdown from their
website and get the markdown files synchronized with in your repo.
They will provide you with a nice website for which you can customize the domain name.
All this is covered by their free tier.
Example:
- [repo ](https://github.com/garronej/evt )
- [GitBook documentation website ](https://docs.evt.land )
I advise you to have a special directory at the root of your project where the markdown documentation files
are stored. It is configured by placing a ``.netbook.yaml` ` file at the root of the repo containing, for example:
``root: ./docs/` `
PS: I am not affiliated with GitBook in any way.
2020-05-15 22:51:31 +02:00
2020-05-17 20:04:08 +02:00
# Creating a landing page for your project.
Beside the documentation website, you might want to have a catchy landing page to share on social networks.
You can use [GitHub pages ](https://pages.github.com ) to host it.
If you like the landing page of EVT, [evt.land ](http://evt.land ), you can fork the [repo ](https://github.com/garronej/evt.land ) and adapt it for your module.
You'll just have to go to settings and enable Pages.

And update your DNS:

I personally use [Hurricane Electric ](https://dns.he.net ) free DNS servers because they support a lot of record types.
If your provider does not support ``ALIAS``, however, you can use ``A` ` records and manually enter the IP of GitHub servers.
I let you consult the [GitHub Pages Documentation ](https://help.github.com/en/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site#configuring-an-apex-domain ).