├── 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 |
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 |
--------------------------------------------------------------------------------