├── .eslintignore ├── .eslintrc ├── .gitignore ├── .prettierrc ├── README.md ├── jest.config.base.js ├── jest.config.js ├── lerna.json ├── package.json ├── packages ├── interfaces │ ├── package.json │ ├── src │ │ └── index.ts │ └── tsconfig.json ├── package-a │ ├── __tests__ │ │ └── dummy.test.ts │ ├── jest.config.js │ ├── package.json │ ├── src │ │ └── index.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── package-b │ ├── .gitignore │ ├── build │ │ └── bundleDts.js │ ├── index.html │ ├── package.json │ ├── src │ │ ├── App.css │ │ ├── App.tsx │ │ ├── favicon.svg │ │ ├── index.css │ │ ├── index.ts │ │ ├── logo.svg │ │ ├── main.tsx │ │ └── vite-env.d.ts │ ├── tsconfig.json │ └── vite.config.ts └── package-c │ ├── package.json │ ├── src │ └── index.ts │ └── tsconfig.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml └── tsconfig.json /.eslintignore: -------------------------------------------------------------------------------- 1 | */**.js 2 | */**.d.ts 3 | packages/*/dist 4 | packages/*/lib -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es6": true, 5 | "node": true 6 | }, 7 | "extends": [ 8 | "react-app", 9 | "plugin:react/recommended", 10 | "plugin:react-hooks/recommended", 11 | "prettier-standard" 12 | ], 13 | "parserOptions": { 14 | "project": "./tsconfig.json" 15 | }, 16 | "plugins": [ 17 | "react", 18 | "@typescript-eslint", 19 | "react-hooks", 20 | "prettier", 21 | "simple-import-sort" 22 | ], 23 | "rules": { 24 | "no-use-before-define": "off", 25 | "prettier/prettier": [ 26 | "error", 27 | { 28 | "endOfLine": "auto" 29 | } 30 | ], 31 | "simple-import-sort/exports": "error", 32 | 33 | "simple-import-sort/imports": [ 34 | "error", 35 | { 36 | "groups": [ 37 | // Node.js builtins. You could also generate this regex if you use a `.js` config. 38 | // For example: `^(${require("module").builtinModules.join("|")})(/|$)` 39 | [ 40 | "^(assert|buffer|child_process|cluster|console|constants|crypto|dgram|dns|domain|events|fs|http|https|module|net|os|path|punycode|querystring|readline|repl|stream|string_decoder|sys|timers|tls|tty|url|util|vm|zlib|freelist|v8|process|async_hooks|http2|perf_hooks)(/.*|$)" 41 | ], 42 | // Packages 43 | ["^\\w"], 44 | // Internal packages. 45 | ["^(@|config/)(/*|$)"], 46 | // Side effect imports. 47 | ["^\\u0000"], 48 | // Parent imports. Put `..` last. 49 | ["^\\.\\.(?!/?$)", "^\\.\\./?$"], 50 | // Other relative imports. Put same-folder imports and `.` last. 51 | ["^\\./(?=.*/)(?!/?$)", "^\\.(?!/?$)", "^\\./?$"], 52 | // Style imports. 53 | ["^.+\\.s?css$"] 54 | ] 55 | } 56 | ], 57 | "import/no-anonymous-default-export": [ 58 | "error", 59 | { 60 | "allowArrowFunction": true, 61 | "allowAnonymousFunction": true 62 | } 63 | ] 64 | } 65 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | lerna-debug.log 3 | npm-debug.log 4 | packages/*/lib 5 | packages/*/dist 6 | .idea 7 | packages/*/coverage 8 | .vscode/ -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | "prettier-config-standard" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Typescript Monorepo Example 2 | 3 | This is a modern typescript monorepo example 4 | 5 | The full write up on how this monorepo works is and how to set it up [here](https://github.com/nickpainter/typescript-monorepo-example.git) 6 | 7 | ## Package Breakdown 8 | 9 | 1. `interfaces` 10 | Typescript only interface repo, no build step, no testing, no javascript support 11 | 2. `package-a` 12 | Package with build step, testing, dependance on `interfaces`, and with publish support for javascript. 13 | Uses `esbuild` for building -> more configurable, better for complex packages 14 | 3. `package-b` 15 | React package with build step, dependance on `package A`, and with publish support for javascript. 16 | Uses `vite` for building, perfect for frontend packages. 17 | 3. `package-c` 18 | Package with build step and publish support for javascript. 19 | Uses `tsup` for building -> zero config, better for simpler packages 20 | 21 | 22 | Both `tsup` and `vite` are built upon `esbuild` so they are all insanely fast. 23 | 24 | 25 | ## Technologies 26 | 27 | - Pnpm - more space efficent package manager 28 | - Esbuild - blazing fast build tool 29 | - Vite - Support for frontend ui packages 30 | - Eslint 31 | - Prettier 32 | - Jest 33 | - [Typescript Project Reference](https://www.typescriptlang.org/docs/handbook/project-references.html) - Incremental and composite typescript builds -------------------------------------------------------------------------------- /jest.config.base.js: -------------------------------------------------------------------------------- 1 | // jestconfig.base.js 2 | module.exports = { 3 | roots: ['/src', '/__tests__'], 4 | transform: { 5 | '^.+\\.ts$': 'ts-jest' 6 | }, 7 | testRegex: '(/__tests__/.*.(test|spec)).(jsx?|tsx?)$', 8 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], 9 | collectCoverage: true, 10 | coveragePathIgnorePatterns: ['(tests/.*.mock).(jsx?|tsx?)$'], 11 | verbose: true, 12 | testTimeout: 30000 13 | } 14 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | // jest.config.js 2 | const base = require('./jest.config.base.js') 3 | 4 | module.exports = { 5 | ...base, 6 | projects: ['/packages/*/jest.config.js'], 7 | coverageDirectory: '/coverage/' 8 | } 9 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": ["packages/*"], 3 | "npmClient": "yarn", 4 | "useWorkspaces": true, 5 | "version": "0.0.1" 6 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript-monorepo-example", 3 | "version": "1.0.0", 4 | "description": "An example typescript monorepo", 5 | "scripts": { 6 | "prepublish": "pnpm build", 7 | "verify": "lerna run verify --stream", 8 | "prettier": "lerna run prettier", 9 | "build": "lerna run build", 10 | "test": "NODE_ENV=development lerna run test --stream" 11 | }, 12 | "author": "@CryogenicPlanet", 13 | "license": "ISC", 14 | "private": true, 15 | "husky": { 16 | "hooks": { 17 | "pre-commit": "pnpm prettier", 18 | "pre-push": "pnpm verify" 19 | } 20 | }, 21 | "devDependencies": { 22 | "@types/jest": "^26.0.23", 23 | "@types/node": "^15.6.2", 24 | "@typescript-eslint/eslint-plugin": "^4.26.0", 25 | "@typescript-eslint/parser": "^4.26.0", 26 | "babel-eslint": "^10.1.0", 27 | "esbuild": "^0.12.5", 28 | "eslint": "^7.27.0", 29 | "eslint-config-prettier": "^8.3.0", 30 | "eslint-config-prettier-standard": "^4.0.1", 31 | "eslint-config-react-app": "^6.0.0", 32 | "eslint-config-standard": "^16.0.3", 33 | "eslint-plugin-flowtype": "^5.7.2", 34 | "eslint-plugin-import": "^2.23.4", 35 | "eslint-plugin-jsx-a11y": "^6.4.1", 36 | "eslint-plugin-node": "^11.1.0", 37 | "eslint-plugin-prettier": "^3.4.0", 38 | "eslint-plugin-promise": "^5.1.0", 39 | "eslint-plugin-react": "^7.24.0", 40 | "eslint-plugin-react-hooks": "^4.2.0", 41 | "eslint-plugin-simple-import-sort": "^7.0.0", 42 | "eslint-plugin-standard": "^5.0.0", 43 | "husky": "^6.0.0", 44 | "jest": "^27.0.3", 45 | "lerna": "^4.0.0", 46 | "npm-run-all": "^4.1.5", 47 | "prettier": "^2.3.0", 48 | "prettier-config-standard": "^4.0.0", 49 | "ts-jest": "^27.0.2", 50 | "tsconfig-paths-jest": "^0.0.1", 51 | "typescript": "^4.3.2", 52 | "wait-on": "^5.3.0" 53 | }, 54 | "workspaces": [ 55 | "packages/*" 56 | ] 57 | } 58 | -------------------------------------------------------------------------------- /packages/interfaces/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@monorepo/interfaces", 3 | "version": "1.0.0", 4 | "description": "An example interface package of a monorepo", 5 | "main": "src/index.ts", 6 | "scripts": { 7 | "prettier": "prettier --check src/", 8 | "prettier:fix": "prettier --write src/", 9 | "lint": "eslint . --ext .ts,.tsx", 10 | "lint:fix": "yarn lint --fix", 11 | "verify": "run-p prettier lint", 12 | "verify:fix": "yarn prettier:fix && yarn lint:fix", 13 | "build": "echo No build script!" 14 | }, 15 | "author": "Rahul Tarak", 16 | "license": "MIT" 17 | } 18 | -------------------------------------------------------------------------------- /packages/interfaces/src/index.ts: -------------------------------------------------------------------------------- 1 | export type Example = { 2 | example: string 3 | } 4 | -------------------------------------------------------------------------------- /packages/interfaces/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./dist", // Your outDir, 5 | "composite": true 6 | }, 7 | "include": ["./src"] 8 | } -------------------------------------------------------------------------------- /packages/package-a/__tests__/dummy.test.ts: -------------------------------------------------------------------------------- 1 | import dummyFunction from '../src/index' 2 | 3 | describe('Dummy test', () => { 4 | it('Dummy test', () => { 5 | expect(dummyFunction).toBeDefined() 6 | const output = dummyFunction({ example: 'test' }) 7 | expect(output).toMatchObject({ example: 'test' }) 8 | }) 9 | }) 10 | -------------------------------------------------------------------------------- /packages/package-a/jest.config.js: -------------------------------------------------------------------------------- 1 | // packages/package-a/jest.config.js 2 | // Jest configuration for api 3 | const base = require('../../jest.config.base.js') 4 | 5 | // support tsconfig paths 6 | // const tsconfig = require('./tsconfig.json') 7 | // const moduleNameMapper = require('tsconfig-paths-jest')(tsconfig) 8 | 9 | module.exports = { 10 | ...base, 11 | name: '@monorepo/package-a', 12 | displayName: 'Package A' 13 | // moduleNameMapper 14 | } 15 | -------------------------------------------------------------------------------- /packages/package-a/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@monorepo/package-a", 3 | "version": "1.0.0", 4 | "description": "An example monorepo package with testing/esbuild", 5 | "main": "src/index.ts", 6 | "scripts": { 7 | "test": "jest ", 8 | "prettier": "prettier --check src/", 9 | "prettier:fix": "prettier --write src/", 10 | "lint": "eslint . --ext .ts,.tsx", 11 | "lint:fix": "yarn lint --fix", 12 | "verify": "run-p prettier lint", 13 | "verify:fix": "yarn prettier:fix && yarn lint:fix", 14 | "build": "esbuild src/index.ts --define:process.env.NODE_ENV=\\\"production\\\" --bundle --platform=node --sourcemap --outfile=dist/index.js", 15 | "postbuild" : "tsc --build tsconfig.build.json" 16 | }, 17 | "author": "Rahul Tarak", 18 | "license": "MIT", 19 | "dependencies": { 20 | "@monorepo/interfaces": "^1.0.0" 21 | }, 22 | "publishConfig": { 23 | "access" : "public", 24 | "main" : "dist/index.js", 25 | "typings" : "dist/src/index.d.ts" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /packages/package-a/src/index.ts: -------------------------------------------------------------------------------- 1 | import { Example } from '@monorepo/interfaces' 2 | 3 | const dummyFunction = (props: Example) => { 4 | return props 5 | } 6 | 7 | export default dummyFunction 8 | -------------------------------------------------------------------------------- /packages/package-a/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["**/*.spec.ts", "**/*.test.ts"] 4 | } -------------------------------------------------------------------------------- /packages/package-a/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./dist", // Your outDir, 5 | "emitDeclarationOnly": true 6 | }, 7 | "include": ["./src","__tests__/**/**.ts"], 8 | "references": [{ "path": "../interfaces/tsconfig.json" }] 9 | } -------------------------------------------------------------------------------- /packages/package-b/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | -------------------------------------------------------------------------------- /packages/package-b/build/bundleDts.js: -------------------------------------------------------------------------------- 1 | const dts = require('dts-bundle') // package that does this for us 2 | const pkg = require('../package.json') 3 | const path = require('path') 4 | 5 | dts.bundle({ 6 | name: pkg.name, 7 | main: 'dist/src/index.d.ts', 8 | out: path.resolve(__dirname, '../dist/index.d.ts') 9 | }) 10 | -------------------------------------------------------------------------------- /packages/package-b/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /packages/package-b/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@monorepo/package-b", 3 | "version": "0.0.0", 4 | "main": "./dist/index.umd.js", 5 | "typings": "./dist/index.d.ts", 6 | "module": "./dist/index.es.js", 7 | "license": "Apache-2.0", 8 | "exports": { 9 | ".": { 10 | "import": "./dist/index.es.js", 11 | "require": "./dist/index.umd.js" 12 | } 13 | }, 14 | "scripts": { 15 | "dev": "vite", 16 | "build:tsc": "tsc --build && echo 'Completed typecheck!'", 17 | "build:vite": "vite build", 18 | "bundle:tsc": "node build/bundleDts.js", 19 | "build": "npm-run-all build:vite build:tsc bundle:tsc", 20 | "serve": "vite preview", 21 | "prettier": "prettier --check src/", 22 | "prettier:fix": "prettier --write src/", 23 | "lint": "eslint . --ext .ts,.tsx", 24 | "lint:fix": "yarn lint --fix", 25 | "verify": "run-p prettier lint", 26 | "verify:fix": "yarn prettier:fix && yarn lint:fix" 27 | }, 28 | "dependencies": { 29 | "@monorepo/package-a": "^1.0.0", 30 | "react": "^17.0.0", 31 | "react-dom": "^17.0.0" 32 | }, 33 | "devDependencies": { 34 | "@types/react": "^17.0.0", 35 | "@types/react-dom": "^17.0.0", 36 | "@vitejs/plugin-react-refresh": "^1.3.1", 37 | "dts-bundle": "^0.7.3", 38 | "typescript": "^4.1.2", 39 | "vite": "^2.3.5" 40 | }, 41 | "files": [ 42 | "dist", 43 | "!dist/src" 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /packages/package-b/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | 40 | button { 41 | font-size: calc(10px + 2vmin); 42 | } 43 | -------------------------------------------------------------------------------- /packages/package-b/src/App.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | 3 | import dummyFunction from '@monorepo/package-a' 4 | 5 | import logo from './logo.svg' 6 | 7 | import './App.css' 8 | 9 | function App() { 10 | const [count, setCount] = useState(0) 11 | 12 | return ( 13 |
14 |
15 | logo 16 |

Hello Vite + React!

17 |

18 | 25 |

26 |

27 | Edit App.tsx and save to test HMR updates. 28 |

29 |

30 | 35 | Learn React 36 | 37 | {' | '} 38 | 43 | Vite Docs 44 | 45 |

46 |
47 |
48 | ) 49 | } 50 | 51 | export default App 52 | -------------------------------------------------------------------------------- /packages/package-b/src/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /packages/package-b/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /packages/package-b/src/index.ts: -------------------------------------------------------------------------------- 1 | import App from './App' 2 | 3 | export { App } 4 | -------------------------------------------------------------------------------- /packages/package-b/src/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /packages/package-b/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | 4 | import App from './App' 5 | 6 | import './index.css' 7 | 8 | ReactDOM.render( 9 | 10 | 11 | , 12 | document.getElementById('root') 13 | ) 14 | -------------------------------------------------------------------------------- /packages/package-b/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /packages/package-b/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist" 5 | }, 6 | "include": ["src/*"], 7 | "exclude": ["dist/*"], 8 | "references": [{ "path": "../package-a/tsconfig.build.json" }] 9 | } 10 | -------------------------------------------------------------------------------- /packages/package-b/vite.config.ts: -------------------------------------------------------------------------------- 1 | // vite.config.ts 2 | import path from 'path' 3 | 4 | import { defineConfig } from 'vite' 5 | 6 | // import tsconfigPaths from 'vite-tsconfig-paths' // can remove if you don't use ts config paths 7 | import reactRefresh from '@vitejs/plugin-react-refresh' 8 | 9 | // https://vitejs.dev/config/ 10 | export default defineConfig({ 11 | plugins: [ 12 | reactRefresh() 13 | // tsconfigPaths() 14 | ], 15 | build: { 16 | lib: { 17 | entry: path.resolve(__dirname, 'src/index.ts'), 18 | name: '@monorepo/package-b', 19 | fileName: 'index' 20 | }, 21 | rollupOptions: { 22 | external: ['react'], 23 | output: { 24 | globals: { 25 | react: 'react' 26 | } 27 | } 28 | } 29 | } 30 | }) 31 | -------------------------------------------------------------------------------- /packages/package-c/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@monorepo/package-c", 3 | "version": "1.0.0", 4 | "description": "An example monorepo package with tsup", 5 | "main": "src/index.ts", 6 | "scripts": { 7 | "prettier": "prettier --check src/", 8 | "prettier:fix": "prettier --write src/", 9 | "lint": "eslint . --ext .ts,.tsx", 10 | "lint:fix": "yarn lint --fix", 11 | "verify": "run-p prettier lint", 12 | "verify:fix": "yarn prettier:fix && yarn lint:fix", 13 | "build": "tsup src/* --env.NODE_ENV production --dts-resolve" 14 | }, 15 | "author": "Rahul Tarak", 16 | "license": "MIT", 17 | "devDependencies": { 18 | "tsup": "^4.11.2" 19 | }, 20 | "browser": "dist/index.js", 21 | "publishConfig": { 22 | "access": "public", 23 | "main": "dist/index.js", 24 | "typings": "dist/index.d.ts" 25 | }, 26 | "files": [ 27 | "dist/*" 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /packages/package-c/src/index.ts: -------------------------------------------------------------------------------- 1 | const main = () => { 2 | console.log('I AM a seperate package') 3 | } 4 | 5 | main() 6 | 7 | export default main 8 | -------------------------------------------------------------------------------- /packages/package-c/tsconfig.json: -------------------------------------------------------------------------------- 1 | // tsconfig.json 2 | { 3 | "extends": "../../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./dist", // Your outDir 6 | }, 7 | "include": ["./src"] 8 | } -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | # all packages in subdirs of packages/ and components/ 3 | - 'packages/**' 4 | # exclude packages that are inside test directories 5 | - '!**/test/**' 6 | - '!**/__tests__/**' 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "noImplicitAny": false, 5 | "removeComments": true, 6 | "noLib": false, 7 | "emitDecoratorMetadata": true, 8 | "experimentalDecorators": true, 9 | "target": "es6", 10 | "sourceMap": true, 11 | "module": "commonjs", 12 | "jsx": "preserve", 13 | "strict": true, 14 | "moduleResolution": "node", 15 | "resolveJsonModule": true, 16 | "allowSyntheticDefaultImports": true, 17 | "esModuleInterop": true, 18 | "lib": ["dom", "dom.iterable", "esnext", "webworker"], 19 | "skipLibCheck": true, 20 | "forceConsistentCasingInFileNames": true, 21 | "isolatedModules": true, 22 | "composite": true 23 | }, 24 | "exclude": ["node_modules", "**/*/lib", "**/*/dist"], 25 | "references": [ 26 | { "path": "./packages/package-a/tsconfig.build.json" }, 27 | { "path": "./packages/package-b" }, 28 | { "path": "./packages/package-c/" }, 29 | { "path": "./packages/interfaces/" }, 30 | ] 31 | } --------------------------------------------------------------------------------