├── README.md ├── demo ├── .gitignore ├── .prettierrc ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── robots.txt ├── react-app-env.d.ts ├── src │ ├── App.tsx │ ├── index.tsx │ └── react-app-env.d.ts └── tsconfig.json └── library ├── .babelrc ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .prettierrc ├── package-lock.json ├── package.json ├── rollup.config.js ├── src ├── Data │ ├── Item │ │ └── index.tsx │ ├── List │ │ └── index.tsx │ └── index.ts ├── Select │ ├── index.tsx │ └── styles.css ├── common │ ├── context │ │ ├── Select │ │ │ └── index.tsx │ │ └── index.ts │ └── index.ts ├── css.d.ts ├── index.ts └── types.ts └── tsconfig.json /README.md: -------------------------------------------------------------------------------- 1 | # React Library 2 | 3 | ## Setup 4 | 5 | ### Installation 6 | 7 | - `git clone` this repository 8 | - first terminal: `cd demo && npm install && npm start` 9 | - second terminal: `cd library && npm run library:build` 10 | 11 | ### Publish 12 | 13 | - create account on https://www.npmjs.com 14 | - `npm login` on command line 15 | - replace `rwieruch-react-library` in all files with `your-name-react-library` 16 | - first terminal: `cd library && npm run library:build && npm publish` 17 | - second terminal: `cd demo && npm install your-name-react-library` 18 | 19 | ### Update 20 | 21 | - make changes in _/library_ 22 | - increment `version` in _package.json_ 23 | - first terminal: `cd library && npm run library:build && npm publish` 24 | - second terminal: `cd demo && npm install your-name-react-library` 25 | 26 | ## Tasks 27 | 28 | ### Webpack to Rollup 29 | 30 | - The _/library_ is build with Webpack and Babel. However, Rollup is the most popular choice when it comes to libraries. So exchange Webpack with Rollup, but keep and use the _.babelrc_. 31 | 32 | ### Code Splitting 33 | 34 | - Webpack does code splitting at the moment. Rollup should do the same, so that the annotated // TODO imports in _/demo/src/App.js_ work. 35 | 36 | ### TypeScript 37 | 38 | - Make _/library_ work with TypeScript and export the type definitions. Then convert _/demo_ to TypeScript and use the typed library. 39 | 40 | ### CSS Modules instead of Styled Components 41 | 42 | - Make _/library_ work with CSS Modules instead of TypeSript. The crucial file that needs to work is _/library/src/Data/Item/index.js_ with its _theme_ and _offset_. So injecting CSS from the outside needs to work (_theme_) and setting dynamic values (_offset_) should work too. 43 | 44 | ### NPM Link 45 | 46 | - Use NPM linking, so that /library can be used like a library in /demo, but without installing it via npm. 47 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /demo/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "printWidth": 70 4 | } -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.11.4", 7 | "@testing-library/react": "^11.1.0", 8 | "@testing-library/user-event": "^12.1.10", 9 | "@types/jest": "^26.0.15", 10 | "@types/node": "^12.0.0", 11 | "@types/react": "^16.9.53", 12 | "@types/react-dom": "^16.9.8", 13 | "mh-react-library": "^0.0.4", 14 | "react": "^17.0.1", 15 | "react-dom": "^17.0.1", 16 | "react-scripts": "4.0.1", 17 | "styled-components": "^5.2.1", 18 | "tslib": "^1.14.1", 19 | "typescript": "^4.0.3", 20 | "web-vitals": "^1.1.0" 21 | }, 22 | "scripts": { 23 | "start": "react-scripts start", 24 | "build": "react-scripts build", 25 | "test": "react-scripts test", 26 | "eject": "react-scripts eject" 27 | }, 28 | "eslintConfig": { 29 | "extends": [ 30 | "react-app", 31 | "react-app/jest" 32 | ] 33 | }, 34 | "browserslist": { 35 | "production": [ 36 | ">0.2%", 37 | "not dead", 38 | "not op_mini all" 39 | ], 40 | "development": [ 41 | "last 1 chrome version", 42 | "last 1 firefox version", 43 | "last 1 safari version" 44 | ] 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /demo/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rwieruch/react-library/b70d6a0a75627ae919fe001e898b70d9afdd76a7/demo/public/favicon.ico -------------------------------------------------------------------------------- /demo/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /demo/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rwieruch/react-library/b70d6a0a75627ae919fe001e898b70d9afdd76a7/demo/public/logo192.png -------------------------------------------------------------------------------- /demo/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rwieruch/react-library/b70d6a0a75627ae919fe001e898b70d9afdd76a7/demo/public/logo512.png -------------------------------------------------------------------------------- /demo/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /demo/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /demo/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /demo/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { List, Item } from 'mh-react-library/lib/data'; 2 | import { SelectButton } from 'mh-react-library/lib/select'; 3 | 4 | // TODO: finally make it work without the extra /lib path 5 | 6 | // import { List, Item } from 'mh-react-library/data'; 7 | // import { SelectButton } from 'mh-react-library/select'; 8 | 9 | const list = [ 10 | { 11 | id: '1', 12 | name: 'foo', 13 | isSelect: false, 14 | }, 15 | { 16 | id: '2', 17 | name: 'bar', 18 | isSelect: true, 19 | }, 20 | ]; 21 | 22 | const App = () => ( 23 | 24 | {list.map((item, i) => ( 25 | 35 | {item.name} Select 36 | 37 | ))} 38 | 39 | ); 40 | 41 | export default App; 42 | -------------------------------------------------------------------------------- /demo/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | 4 | import App from './App'; 5 | 6 | ReactDOM.render( 7 | 8 | 9 | , 10 | document.getElementById('root') 11 | ); 12 | -------------------------------------------------------------------------------- /demo/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /demo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "esModuleInterop": true, 8 | "allowSyntheticDefaultImports": true, 9 | "strict": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "noFallthroughCasesInSwitch": true, 12 | "module": "esnext", 13 | "moduleResolution": "node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx", 18 | "importHelpers": true, 19 | "removeComments": true, 20 | "typeRoots": ["node_modules/@types"] 21 | }, 22 | "include": ["src"] 23 | } 24 | -------------------------------------------------------------------------------- /library/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env", "@babel/preset-react"], 3 | "plugins": [ 4 | "@babel/plugin-proposal-export-default-from", 5 | "@babel/plugin-proposal-optional-chaining", 6 | [ 7 | "@babel/plugin-transform-runtime", 8 | { 9 | "regenerator": true 10 | } 11 | ] 12 | ], 13 | "env": { 14 | "test": { 15 | "presets": ["@babel/preset-env", "@babel/preset-react"] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /library/.eslintignore: -------------------------------------------------------------------------------- 1 | dist/* 2 | lib/* 3 | public/* 4 | 5 | node_modules/* 6 | 7 | **/*.snap.js -------------------------------------------------------------------------------- /library/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "@typescript-eslint/parser", 3 | "parserOptions": { 4 | "project": "./tsconfig.json", 5 | "ecmaVersion": 2020, 6 | "sourceType": "module", 7 | "ecmaFeatures": { 8 | "jsx": true 9 | } 10 | }, 11 | "env": { 12 | "browser": true, 13 | "commonjs": true, 14 | "node": true, 15 | "mocha": true, 16 | "jest": true 17 | }, 18 | "extends": [ 19 | "plugin:react/recommended", 20 | "plugin:@typescript-eslint/recommended", 21 | "airbnb-typescript", 22 | "prettier", 23 | "plugin:import/errors", 24 | "plugin:import/warnings", 25 | "plugin:import/typescript" 26 | ], 27 | "plugins": ["prettier", "react-hooks"], 28 | "settings": { 29 | "import/resolver": { 30 | "babel-module": {} 31 | }, 32 | "react": { 33 | "version": "detect" 34 | } 35 | }, 36 | "rules": { 37 | "prettier/prettier": ["error"], 38 | "react-hooks/rules-of-hooks": "error", 39 | "react-hooks/exhaustive-deps": "warn", 40 | "react/prop-types": 0, 41 | "react/require-default-props": 0, 42 | "react/jsx-wrap-multilines": 0, 43 | "react/jsx-filename-extension": [ 44 | 1, 45 | { 46 | "extensions": [".ts", ".tsx"] 47 | } 48 | ], 49 | "jsx-a11y/heading-has-content": 0, 50 | "jsx-a11y/anchor-has-content": 0, 51 | "jsx-a11y/anchor-is-valid": 0, 52 | "import/prefer-default-export": 0, 53 | "import/no-extraneous-dependencies": [ 54 | "error", 55 | { 56 | "devDependencies": true 57 | } 58 | ], 59 | "no-param-reassign": [ 60 | 2, 61 | { 62 | "props": false 63 | } 64 | ] 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /library/.gitignore: -------------------------------------------------------------------------------- 1 | npm-debug.log* 2 | yarn-debug.log* 3 | yarn-error.log* 4 | 5 | node_modules 6 | lib 7 | dist 8 | 9 | .npmrc 10 | .orig 11 | public/ 12 | 13 | .vscode/ 14 | .eslintcache 15 | -------------------------------------------------------------------------------- /library/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "printWidth": 70 4 | } -------------------------------------------------------------------------------- /library/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mh-react-library", 3 | "version": "0.0.4", 4 | "description": "mh-react-library", 5 | "main": "lib/main.js", 6 | "files": [ 7 | "/lib" 8 | ], 9 | "peerDependencies": { 10 | "react": "^16.13.1 || ^17", 11 | "react-dom": "^16.13.1 || ^17" 12 | }, 13 | "dependencies": { 14 | "styled-components": "^5.0.1" 15 | }, 16 | "devDependencies": { 17 | "@babel/core": "^7.12.10", 18 | "@babel/eslint-parser": "^7.12.1", 19 | "@babel/node": "^7.12.10", 20 | "@babel/plugin-proposal-export-default-from": "^7.12.1", 21 | "@babel/plugin-proposal-optional-chaining": "^7.12.7", 22 | "@babel/plugin-transform-runtime": "^7.12.10", 23 | "@babel/preset-env": "^7.12.11", 24 | "@babel/preset-react": "^7.12.10", 25 | "@babel/runtime": "^7.12.5", 26 | "@rollup/plugin-babel": "^5.2.2", 27 | "@rollup/plugin-commonjs": "^17.0.0", 28 | "@rollup/plugin-node-resolve": "^11.1.0", 29 | "@rollup/plugin-typescript": "^8.1.0", 30 | "@storybook/addon-docs": "^6.1.15", 31 | "@storybook/cli": "^6.1.15", 32 | "@storybook/react": "^6.1.15", 33 | "@storybook/source-loader": "^6.1.15", 34 | "@types/jest": "^26.0.20", 35 | "@types/node": "^14.11.2", 36 | "@types/react": "^16.9.49", 37 | "@types/react-dom": "^17.0.0", 38 | "@types/styled-components": "^5.1.7", 39 | "@typescript-eslint/eslint-plugin": "^4.14.1", 40 | "@typescript-eslint/parser": "^4.14.1", 41 | "@wessberg/rollup-plugin-ts": "^1.3.8", 42 | "babel-jest": "^26.6.3", 43 | "babel-plugin-module-resolver": "^4.1.0", 44 | "eslint": "^7.18.0", 45 | "eslint-config-airbnb": "^18.2.1", 46 | "eslint-config-airbnb-typescript": "^12.0.0", 47 | "eslint-config-prettier": "^7.2.0", 48 | "eslint-import-resolver-babel-module": "^5.2.0", 49 | "eslint-plugin-import": "^2.22.1", 50 | "eslint-plugin-jsx-a11y": "^6.4.1", 51 | "eslint-plugin-prettier": "^3.3.1", 52 | "eslint-plugin-react": "^7.22.0", 53 | "eslint-plugin-react-hooks": "^4.2.0", 54 | "jest": "^26.6.3", 55 | "postcss": "^8.2.4", 56 | "prettier": "^2.2.1", 57 | "prop-types": "15.7.2", 58 | "react": "^17.0.1", 59 | "react-dom": "^17.0.1", 60 | "rollup": "^2.38.0", 61 | "rollup-plugin-peer-deps-external": "^2.2.4", 62 | "rollup-plugin-postcss": "^4.0.0", 63 | "rollup-plugin-terser": "^7.0.2", 64 | "tslib": "^2.1.0", 65 | "typescript": "^4.1.3" 66 | }, 67 | "scripts": { 68 | "prettier": "prettier 'src/**/*.{js,ts,tsx}'", 69 | "prettier:write": "npm run prettier -- --write", 70 | "prettier:check": "npm run prettier -- --check", 71 | "lint": "eslint 'src/**/*.{js,ts,tsx}' --ignore-pattern .eslintignore --max-warnings 0", 72 | "lint:check": "npm run lint", 73 | "lint:fix": "npm run lint -- --fix", 74 | "storybook:dev": "start-storybook --docs -s ./static -c .storybook -p 9001", 75 | "storybook:build": "build-storybook --docs -s ./static -c .storybook -o dist", 76 | "library:build": "rollup -c" 77 | }, 78 | "repository": { 79 | "type": "git", 80 | "url": "git+https://github.com/rwieruch/rwieruch-react-library.git" 81 | }, 82 | "keywords": [], 83 | "author": "Robin Wieruch (https://www.robinwieruch.de)", 84 | "license": "UNLICENSED", 85 | "bugs": { 86 | "url": "https://github.com/rwieruch/rwieruch-react-library/issues" 87 | }, 88 | "homepage": "https://github.com/rwieruch/rwieruch-react-library#readme" 89 | } 90 | -------------------------------------------------------------------------------- /library/rollup.config.js: -------------------------------------------------------------------------------- 1 | import resolve from '@rollup/plugin-node-resolve'; 2 | import commonjs from '@rollup/plugin-commonjs'; 3 | // import babel from '@rollup/plugin-babel'; 4 | import { terser } from 'rollup-plugin-terser'; 5 | // import typescript from '@rollup/plugin-typescript'; 6 | import peerDepsExternal from 'rollup-plugin-peer-deps-external'; 7 | import ts from '@wessberg/rollup-plugin-ts'; 8 | import postcss from 'rollup-plugin-postcss'; 9 | import pkg from './package.json'; 10 | 11 | export default { 12 | input: { 13 | main: './src/index.ts', 14 | data: './src/Data/index.ts', 15 | select: './src/Select/index.tsx', 16 | common: './src/common/index.ts', 17 | }, 18 | 19 | output: [ 20 | // ES module version, for modern browsers 21 | { 22 | name: 'react-library', 23 | dir: `${__dirname}/lib`, 24 | format: 'es', 25 | sourcemap: true, 26 | entryFileNames: '[name].js', 27 | // preserveModules: true, 28 | }, 29 | // SystemJS version, for older browsers 30 | // { 31 | // dir: `${__dirname}/lib/nomodule`, 32 | // format: 'system', 33 | // sourcemap: true, 34 | // }, 35 | ], 36 | external: [ 37 | ...Object.keys(pkg.dependencies || {}), 38 | ...Object.keys(pkg.peerDependencies || {}), 39 | ], 40 | plugins: [ 41 | peerDepsExternal(), 42 | postcss({ 43 | modules: true, 44 | }), 45 | resolve({ 46 | browser: true, 47 | }), 48 | commonjs({ 49 | sourceMap: true, 50 | exclude: 'src/**', 51 | }), 52 | 53 | ts({ 54 | transpiler: 'babel', 55 | }), 56 | // babel({ 57 | // babelHelpers: 'runtime', 58 | // exclude: 'node_modules/**', 59 | // }), 60 | // typescript({ sourceMap: true }), 61 | terser({ 62 | module: true, 63 | }), 64 | ], 65 | }; 66 | -------------------------------------------------------------------------------- /library/src/Data/Item/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import styled from 'styled-components'; 3 | 4 | import { SelectContext } from '../../common/context'; 5 | import { ISelectContext } from '../../types'; 6 | 7 | const Li = styled.li` 8 | &.selected { 9 | background-color: grey; 10 | } 11 | 12 | margin-left: ${({ offset }: { offset: number }) => offset}px; 13 | 14 | ${({ theme }: { theme: string }) => theme}; 15 | `; 16 | 17 | const Item = ({ 18 | id, 19 | offset = 0, 20 | theme, 21 | children 22 | }: { 23 | id: string; 24 | offset: number; 25 | theme: string; 26 | children: React.ReactNode; 27 | }) => { 28 | const { selectedIds } = React.useContext( 29 | SelectContext 30 | ); 31 | 32 | return ( 33 |
  • 38 | {children} 39 |
  • 40 | ); 41 | }; 42 | 43 | export { Item }; 44 | -------------------------------------------------------------------------------- /library/src/Data/List/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | import { SelectProvider } from '../../common/context'; 4 | 5 | const List = ({ children }: { children: React.ReactNode }) => ( 6 | 7 |
      {children}
    8 |
    9 | ); 10 | 11 | export { List }; 12 | -------------------------------------------------------------------------------- /library/src/Data/index.ts: -------------------------------------------------------------------------------- 1 | export * from './List'; 2 | export * from './Item'; 3 | -------------------------------------------------------------------------------- /library/src/Select/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | import { SelectContext } from '../common/context'; 4 | import { ISelectContext } from '../types'; 5 | 6 | import styles from './styles.css'; 7 | 8 | const SelectButton = ({ 9 | id, 10 | children 11 | }: { 12 | id: string; 13 | children: React.ReactNode; 14 | }) => { 15 | const { toggleSelect } = React.useContext( 16 | SelectContext 17 | ); 18 | 19 | return ( 20 | 27 | ); 28 | }; 29 | 30 | export { SelectButton }; 31 | -------------------------------------------------------------------------------- /library/src/Select/styles.css: -------------------------------------------------------------------------------- 1 | .red { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /library/src/common/context/Select/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | import { ISelectContext } from '../../../types'; 4 | 5 | const SelectContext = React.createContext({}); 6 | 7 | const SelectProvider = ({ 8 | children, 9 | }: { 10 | children: React.ReactNode; 11 | }) => { 12 | const [selectedIds, setSelectedIds] = React.useState([]); 13 | 14 | const toggleSelect = (id: string) => { 15 | if (selectedIds.includes(id)) { 16 | setSelectedIds((state) => 17 | state.filter((selectedId) => selectedId !== id) 18 | ); 19 | } else { 20 | setSelectedIds((state) => state.concat(id)); 21 | } 22 | }; 23 | 24 | return ( 25 | 31 | {children} 32 | 33 | ); 34 | }; 35 | 36 | export { SelectContext, SelectProvider }; 37 | -------------------------------------------------------------------------------- /library/src/common/context/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Select'; 2 | -------------------------------------------------------------------------------- /library/src/common/index.ts: -------------------------------------------------------------------------------- 1 | export * from './context'; 2 | -------------------------------------------------------------------------------- /library/src/css.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.css' { 2 | interface IClassNames { 3 | [className: string]: string; 4 | } 5 | const classNames: IClassNames; 6 | export = classNames; 7 | } 8 | -------------------------------------------------------------------------------- /library/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Data'; 2 | export * from './Select'; 3 | -------------------------------------------------------------------------------- /library/src/types.ts: -------------------------------------------------------------------------------- 1 | export interface ISelectContext { 2 | selectedIds?: string[]; 3 | toggleSelect?: (id: string) => void; 4 | } 5 | -------------------------------------------------------------------------------- /library/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | // "rootDir": "src", 4 | "outDir": "lib", 5 | "strict": false, 6 | "module": "esnext", 7 | "lib": ["dom", "esnext"], 8 | "moduleResolution": "node", 9 | "jsx": "react", 10 | "allowJs": true, 11 | "sourceMap": true, 12 | "declaration": true, 13 | "declarationDir": "lib", 14 | "esModuleInterop": true, 15 | "noImplicitReturns": true, 16 | "noImplicitThis": true, 17 | "noImplicitAny": true, 18 | "strictNullChecks": true, 19 | "suppressImplicitAnyIndexErrors": true, 20 | "noUnusedLocals": true, 21 | "noUnusedParameters": true, 22 | "allowSyntheticDefaultImports": true, 23 | "importHelpers": true, 24 | "removeComments": true, 25 | "forceConsistentCasingInFileNames": true, 26 | "resolveJsonModule": true, 27 | "typeRoots": ["node_modules/@types"] 28 | }, 29 | "include": ["src"], 30 | "exclude": ["node_modules", "lib"] 31 | } 32 | --------------------------------------------------------------------------------