diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fcadb2c --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text eol=lf diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..affcfe1 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,32 @@ +name: CI +on: [push] +jobs: + build: + name: Build, lint, and test on Node ${{ matrix.node }} and ${{ matrix.os }} + + runs-on: ${{ matrix.os }} + strategy: + matrix: + node: ['14.x', '16.x'] + os: [ubuntu-latest, windows-latest, macOS-latest] + + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Use Node ${{ matrix.node }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + + - name: Install deps and build (with cache) + uses: bahmutov/npm-install@v1 + + - name: Lint + run: yarn lint + + - name: Test + run: yarn test --ci --coverage --maxWorkers=2 + + - name: Build + run: yarn build diff --git a/.github/workflows/size.yml b/.github/workflows/size.yml new file mode 100644 index 0000000..bc80c4c --- /dev/null +++ b/.github/workflows/size.yml @@ -0,0 +1,12 @@ +name: size +on: [pull_request] +jobs: + size: + runs-on: ubuntu-latest + env: + CI_JOB_NUMBER: 1 + steps: + - uses: actions/checkout@v3 + - uses: andresz1/size-limit-action@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c9d7c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.log +.DS_Store +node_modules +dist diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a85f7d6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Soham Zemse + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e6c3f81 --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +# DTS User Guide + +Congrats! You just saved yourself hours of work by bootstrapping this project with DTS. Let’s get you oriented with what’s here and how to use it. + +> This DTS setup is meant for developing libraries (not apps!) that can be published to NPM. If you’re looking to build a Node app, you could use `ts-node-dev`, plain `ts-node`, or simple `tsc`. + +> If you’re new to TypeScript, checkout [this handy cheatsheet](https://devhints.io/typescript) + +## Commands + +DTS scaffolds your new library inside `/src`. + +To run DTS, use: + +```bash +npm start # or yarn start +``` + +This builds to `/dist` and runs the project in watch mode so any edits you save inside `src` causes a rebuild to `/dist`. + +To do a one-off build, use `npm run build` or `yarn build`. + +To run tests, use `npm test` or `yarn test`. + +## Configuration + +Code quality is set up for you with `prettier`, `husky`, and `lint-staged`. Adjust the respective fields in `package.json` accordingly. + +### Jest + +Jest tests are set up to run with `npm test` or `yarn test`. + +### Bundle Analysis + +[`size-limit`](https://github.com/ai/size-limit) is set up to calculate the real cost of your library with `npm run size` and visualize the bundle with `npm run analyze`. + +#### Setup Files + +This is the folder structure we set up for you: + +```txt +/src + index.ts # EDIT THIS +/test + index.test.ts # EDIT THIS +.gitignore +package.json +README.md # EDIT THIS +tsconfig.json +``` + +### Rollup + +DTS uses [Rollup](https://rollupjs.org) as a bundler and generates multiple rollup configs for various module formats and build settings. See [Optimizations](#optimizations) for details. + +### TypeScript + +`tsconfig.json` is set up to interpret `dom` and `esnext` types, as well as `react` for `jsx`. Adjust according to your needs. + +## Continuous Integration + +### GitHub Actions + +Two actions are added by default: + +- `main` which installs deps w/ cache, lints, tests, and builds on all pushes against a Node and OS matrix +- `size` which comments cost comparison of your library on every pull request using [`size-limit`](https://github.com/ai/size-limit) + +## Optimizations + +Please see the main `dts` [optimizations docs](https://github.com/weiran-zsd/dts-cli#optimizations). In particular, know that you can take advantage of development-only optimizations: + +```js +// ./types/index.d.ts +declare var __DEV__: boolean; + +// inside your code... +if (__DEV__) { + console.log('foo'); +} +``` + +You can also choose to install and use [invariant](https://github.com/weiran-zsd/dts-cli#invariant) and [warning](https://github.com/weiran-zsd/dts-cli#warning) functions. + +## Module Formats + +CJS, ESModules, and UMD module formats are supported. + +The appropriate paths are configured in `package.json` and `dist/index.js` accordingly. Please report if any issues are found. + +## Named Exports + +Per Palmer Group guidelines, [always use named exports.](https://github.com/palmerhq/typescript#exports) Code split inside your React app instead of your React library. + +## Including Styles + +There are many ways to ship styles, including with CSS-in-JS. DTS has no opinion on this, configure how you like. + +For vanilla CSS, you can include it at the root directory and add it to the `files` section in your `package.json`, so that it can be imported separately by your users and run through their bundler's loader. + +## Publishing to NPM + +We recommend using [np](https://github.com/sindresorhus/np). diff --git a/package.json b/package.json new file mode 100644 index 0000000..0dffa64 --- /dev/null +++ b/package.json @@ -0,0 +1,50 @@ +{ + "name": "sdk", + "version": "0.1.0", + "license": "MIT", + "author": "Soham Zemse", + "main": "dist/index.js", + "module": "dist/sdk.esm.js", + "typings": "dist/index.d.ts", + "files": [ + "dist", + "src" + ], + "scripts": { + "analyze": "size-limit --why", + "build": "dts build", + "lint": "dts lint", + "prepare": "dts build", + "size": "size-limit", + "start": "dts watch", + "test": "dts test" + }, + "husky": { + "hooks": { + "pre-commit": "dts lint" + } + }, + "prettier": { + "printWidth": 80, + "semi": true, + "singleQuote": true, + "trailingComma": "es5" + }, + "jest": { + "testEnvironment": "node" + }, + "peerDependencies": {}, + "engines": { + "node": ">=12" + }, + "size-limit": [ + { + "path": "dist/sdk.cjs.production.min.js", + "limit": "10 KB" + }, + { + "path": "dist/sdk.esm.js", + "limit": "10 KB" + } + ] +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..a34e034 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,6 @@ +export const sum = (a: number, b: number) => { + if ('development' === process.env.NODE_ENV) { + console.log('dev only output'); + } + return a + b; +}; diff --git a/test/index.test.ts b/test/index.test.ts new file mode 100644 index 0000000..6a214f1 --- /dev/null +++ b/test/index.test.ts @@ -0,0 +1,7 @@ +import { sum } from '../src/index'; + +describe('sum', () => { + it('adds two numbers together', () => { + expect(sum(1, 1)).toEqual(2); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..4b1a4b6 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@tsconfig/recommended/tsconfig.json", + "include": ["src", "types"], + "compilerOptions": { + "module": "esnext", + "allowImportingTsExtensions": false + } +}