From 16ddcd51f7b180cdbea3e100b1807bcaf09a69a5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 29 Aug 2025 09:10:45 +0000 Subject: [PATCH 1/2] Initial plan From 6b3119c8e1cecd5990b54c490bfb6a3419742738 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 29 Aug 2025 09:20:39 +0000 Subject: [PATCH 2/2] Implement init optimizations: file detection, VSCode support, and new web template Co-authored-by: echosoar <14832743+echosoar@users.noreply.github.com> --- packages/dev/src/init.ts | 31 ++++- packages/tpl-list/package.json | 6 +- packages/tpl-ts-bin/package.json | 2 +- .../template/dot.vscode/extensions.json | 8 ++ .../template/dot.vscode/settings.json | 18 +++ packages/tpl-ts-node/package.json | 2 +- .../template/dot.vscode/extensions.json | 8 ++ .../template/dot.vscode/settings.json | 18 +++ packages/tpl-ts-web/package.json | 7 ++ packages/tpl-ts-web/template/README.md | 117 ++++++++++++++++++ .../tpl-ts-web/template/dot.eslintrc.json | 27 ++++ packages/tpl-ts-web/template/dot.gitignore | 7 ++ .../template/dot.vscode/extensions.json | 11 ++ .../template/dot.vscode/settings.json | 21 ++++ packages/tpl-ts-web/template/jest.config.js | 15 +++ packages/tpl-ts-web/template/package.json | 38 ++++++ .../tpl-ts-web/template/public/index.html | 96 ++++++++++++++ packages/tpl-ts-web/template/src/index.ts | 59 +++++++++ .../tpl-ts-web/template/test/index.test.ts | 65 ++++++++++ packages/tpl-ts-web/template/test/setup.js | 2 + packages/tpl-ts-web/template/tsconfig.json | 28 +++++ .../tpl-ts-web/template/webpack.config.js | 48 +++++++ 22 files changed, 630 insertions(+), 4 deletions(-) create mode 100644 packages/tpl-ts-bin/template/dot.vscode/extensions.json create mode 100644 packages/tpl-ts-bin/template/dot.vscode/settings.json create mode 100644 packages/tpl-ts-node/template/dot.vscode/extensions.json create mode 100644 packages/tpl-ts-node/template/dot.vscode/settings.json create mode 100644 packages/tpl-ts-web/package.json create mode 100644 packages/tpl-ts-web/template/README.md create mode 100644 packages/tpl-ts-web/template/dot.eslintrc.json create mode 100644 packages/tpl-ts-web/template/dot.gitignore create mode 100644 packages/tpl-ts-web/template/dot.vscode/extensions.json create mode 100644 packages/tpl-ts-web/template/dot.vscode/settings.json create mode 100644 packages/tpl-ts-web/template/jest.config.js create mode 100644 packages/tpl-ts-web/template/package.json create mode 100644 packages/tpl-ts-web/template/public/index.html create mode 100644 packages/tpl-ts-web/template/src/index.ts create mode 100644 packages/tpl-ts-web/template/test/index.test.ts create mode 100644 packages/tpl-ts-web/template/test/setup.js create mode 100644 packages/tpl-ts-web/template/tsconfig.json create mode 100644 packages/tpl-ts-web/template/webpack.config.js diff --git a/packages/dev/src/init.ts b/packages/dev/src/init.ts index 5941fe8..50ec305 100644 --- a/packages/dev/src/init.ts +++ b/packages/dev/src/init.ts @@ -3,7 +3,7 @@ import fetch from 'node-fetch'; import * as enquirer from 'enquirer'; import Spin from 'light-spinner'; import { join } from 'path'; -import { createWriteStream, existsSync } from 'fs'; +import { createWriteStream, existsSync, readdirSync } from 'fs'; import { exec, exists } from './utils'; import { tmpdir } from 'os'; import { ensureDir, copy } from 'fs-extra'; @@ -21,6 +21,25 @@ export class InitPlugin extends BasePlugin { 'init:do': this.hanldeLocalServer.bind(this), }; + private async checkAndConfirmOverwrite(dir: string): Promise { + try { + const files = readdirSync(dir).filter(file => !file.startsWith('.git')); + if (files.length > 0) { + console.warn(''); + console.warn(`>> Directory ${dir} contains existing files: ${files.slice(0, 3).join(', ')}${files.length > 3 ? '...' : ''} <<`); + console.warn(''); + const confirm = await (enquirer as any).input({ + message: 'This may overwrite existing files. Continue? (y/N)', + }); + return ['y', 'yes'].includes(confirm.toLowerCase()); + } + return true; + } catch (error) { + // Directory doesn't exist or can't be read, it's safe to proceed + return true; + } + } + async hanldeLocalServer() { // get template list const data = await fetch('https://unpkg.com/make-dev-fast-tpl-list@latest/package.json').then(res => res.json()); @@ -39,6 +58,16 @@ export class InitPlugin extends BasePlugin { console.error(`Error: dir ${name} is exists. (${dir})`); return; } + + // Check for existing files when initializing in current directory + if (name === './') { + const canProceed = await this.checkAndConfirmOverwrite(dir); + if (!canProceed) { + console.log('Operation cancelled.'); + return; + } + } + console.log(`project will create to ${dir}`); await ensureDir(dir); const template = await (enquirer as any).autocomplete({ diff --git a/packages/tpl-list/package.json b/packages/tpl-list/package.json index 7ef26e1..bf0d104 100644 --- a/packages/tpl-list/package.json +++ b/packages/tpl-list/package.json @@ -1,6 +1,6 @@ { "name": "make-dev-fast-tpl-list", - "version": "0.0.2", + "version": "0.0.3", "list": [ { "name": "TypeScript Node NPM", @@ -9,6 +9,10 @@ { "name": "TypeScript Node Bin", "target": "make-dev-fast-tpl-ts-bin" + }, + { + "name": "TypeScript Web Library", + "target": "make-dev-fast-tpl-ts-web" } ] } \ No newline at end of file diff --git a/packages/tpl-ts-bin/package.json b/packages/tpl-ts-bin/package.json index bd0f5df..cd0d5bd 100644 --- a/packages/tpl-ts-bin/package.json +++ b/packages/tpl-ts-bin/package.json @@ -1,6 +1,6 @@ { "name": "make-dev-fast-tpl-ts-bin", - "version": "0.0.2", + "version": "0.0.3", "files": [ "template" ] diff --git a/packages/tpl-ts-bin/template/dot.vscode/extensions.json b/packages/tpl-ts-bin/template/dot.vscode/extensions.json new file mode 100644 index 0000000..571e0e5 --- /dev/null +++ b/packages/tpl-ts-bin/template/dot.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "ms-vscode.vscode-typescript-next", + "bradlc.vscode-tailwindcss", + "ms-vscode.vscode-json" + ] +} \ No newline at end of file diff --git a/packages/tpl-ts-bin/template/dot.vscode/settings.json b/packages/tpl-ts-bin/template/dot.vscode/settings.json new file mode 100644 index 0000000..2f7f65e --- /dev/null +++ b/packages/tpl-ts-bin/template/dot.vscode/settings.json @@ -0,0 +1,18 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit" + }, + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "typescript.preferences.importModuleSpecifier": "relative", + "typescript.suggest.autoImports": true, + "typescript.updateImportsOnFileMove.enabled": "always", + "eslint.enable": true, + "eslint.autoFixOnSave": true, + "eslint.format.enable": true, + "eslint.lintTask.enable": true, + "files.eol": "\n", + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true +} \ No newline at end of file diff --git a/packages/tpl-ts-node/package.json b/packages/tpl-ts-node/package.json index a3496a5..d9cafa9 100644 --- a/packages/tpl-ts-node/package.json +++ b/packages/tpl-ts-node/package.json @@ -1,6 +1,6 @@ { "name": "make-dev-fast-tpl-ts-node", - "version": "0.0.3", + "version": "0.0.4", "files": [ "template" ] diff --git a/packages/tpl-ts-node/template/dot.vscode/extensions.json b/packages/tpl-ts-node/template/dot.vscode/extensions.json new file mode 100644 index 0000000..571e0e5 --- /dev/null +++ b/packages/tpl-ts-node/template/dot.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "ms-vscode.vscode-typescript-next", + "bradlc.vscode-tailwindcss", + "ms-vscode.vscode-json" + ] +} \ No newline at end of file diff --git a/packages/tpl-ts-node/template/dot.vscode/settings.json b/packages/tpl-ts-node/template/dot.vscode/settings.json new file mode 100644 index 0000000..2f7f65e --- /dev/null +++ b/packages/tpl-ts-node/template/dot.vscode/settings.json @@ -0,0 +1,18 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit" + }, + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "typescript.preferences.importModuleSpecifier": "relative", + "typescript.suggest.autoImports": true, + "typescript.updateImportsOnFileMove.enabled": "always", + "eslint.enable": true, + "eslint.autoFixOnSave": true, + "eslint.format.enable": true, + "eslint.lintTask.enable": true, + "files.eol": "\n", + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true +} \ No newline at end of file diff --git a/packages/tpl-ts-web/package.json b/packages/tpl-ts-web/package.json new file mode 100644 index 0000000..a8548ca --- /dev/null +++ b/packages/tpl-ts-web/package.json @@ -0,0 +1,7 @@ +{ + "name": "make-dev-fast-tpl-ts-web", + "version": "0.0.1", + "files": [ + "template" + ] +} \ No newline at end of file diff --git a/packages/tpl-ts-web/template/README.md b/packages/tpl-ts-web/template/README.md new file mode 100644 index 0000000..c6a851d --- /dev/null +++ b/packages/tpl-ts-web/template/README.md @@ -0,0 +1,117 @@ +# TypeScript Web Library + +A modern TypeScript library template for web development with hot reload and live preview. + +## Features + +- ๐Ÿš€ **Development Server**: Live preview with hot reload +- ๐Ÿ”ง **TypeScript**: Full TypeScript support with strict mode +- ๐Ÿงช **Testing**: Jest testing framework with coverage +- ๐Ÿ“ฆ **Build**: Webpack for bundling with UMD output +- ๐ŸŽจ **Linting**: ESLint with TypeScript support +- ๐Ÿ” **IDE Support**: VSCode settings for auto-lint and formatting + +## Getting Started + +### Install Dependencies + +```bash +npm install +``` + +### Development + +Start the development server with hot reload: + +```bash +npm run dev +``` + +This will open your browser at `http://localhost:3000` with a live preview of your library. + +### Building + +Build the library for production: + +```bash +npm run build +``` + +This creates: +- `dist/main.js` - UMD bundle for browsers +- `dist/index.js` - CommonJS module +- `dist/index.d.ts` - TypeScript declarations + +### Testing + +Run tests: + +```bash +npm test +``` + +Run tests with coverage: + +```bash +npm run coverage +``` + +### Linting + +Check code quality: + +```bash +npm run lint +``` + +Auto-fix linting issues: + +```bash +npm run lint:fix +``` + +## Project Structure + +``` +โ”œโ”€โ”€ src/ +โ”‚ โ””โ”€โ”€ index.ts # Main library code +โ”œโ”€โ”€ test/ +โ”‚ โ”œโ”€โ”€ setup.js # Test setup +โ”‚ โ””โ”€โ”€ index.test.ts # Unit tests +โ”œโ”€โ”€ public/ +โ”‚ โ””โ”€โ”€ index.html # Demo page +โ”œโ”€โ”€ dist/ # Built files (generated) +โ”œโ”€โ”€ webpack.config.js # Webpack configuration +โ”œโ”€โ”€ tsconfig.json # TypeScript configuration +โ”œโ”€โ”€ jest.config.js # Jest configuration +โ””โ”€โ”€ .eslintrc.json # ESLint configuration +``` + +## Usage + +### In Browser (UMD) + +```html + + +``` + +### As NPM Module + +```javascript +import { hello, Calculator } from 'your-library-name'; + +console.log(hello('World')); + +const calc = new Calculator(); +const result = calc.add(5).multiply(2).getResult(); // 10 +``` + +## Development Tips + +- The dev server automatically reloads when you change source files +- Use the demo page at `http://localhost:3000` to test your library +- TypeScript declarations are automatically generated during build +- ESLint is configured for TypeScript and will auto-fix on save in VSCode \ No newline at end of file diff --git a/packages/tpl-ts-web/template/dot.eslintrc.json b/packages/tpl-ts-web/template/dot.eslintrc.json new file mode 100644 index 0000000..c7058b6 --- /dev/null +++ b/packages/tpl-ts-web/template/dot.eslintrc.json @@ -0,0 +1,27 @@ +{ + "parser": "@typescript-eslint/parser", + "extends": [ + "@typescript-eslint/recommended" + ], + "plugins": [ + "@typescript-eslint" + ], + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module" + }, + "rules": { + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-explicit-any": "warn", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-inferrable-types": "off", + "semi": ["error", "always"], + "quotes": ["error", "single"] + }, + "env": { + "browser": true, + "es6": true, + "node": true + } +} \ No newline at end of file diff --git a/packages/tpl-ts-web/template/dot.gitignore b/packages/tpl-ts-web/template/dot.gitignore new file mode 100644 index 0000000..684192a --- /dev/null +++ b/packages/tpl-ts-web/template/dot.gitignore @@ -0,0 +1,7 @@ +node_modules +dist +coverage +*.log +.DS_Store +.env +.env.local \ No newline at end of file diff --git a/packages/tpl-ts-web/template/dot.vscode/extensions.json b/packages/tpl-ts-web/template/dot.vscode/extensions.json new file mode 100644 index 0000000..5c0909f --- /dev/null +++ b/packages/tpl-ts-web/template/dot.vscode/extensions.json @@ -0,0 +1,11 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "ms-vscode.vscode-typescript-next", + "dbaeumer.vscode-eslint", + "bradlc.vscode-tailwindcss", + "ms-vscode.vscode-json", + "formulahendry.auto-rename-tag", + "christian-kohler.path-intellisense" + ] +} \ No newline at end of file diff --git a/packages/tpl-ts-web/template/dot.vscode/settings.json b/packages/tpl-ts-web/template/dot.vscode/settings.json new file mode 100644 index 0000000..7298e52 --- /dev/null +++ b/packages/tpl-ts-web/template/dot.vscode/settings.json @@ -0,0 +1,21 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit" + }, + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "typescript.preferences.importModuleSpecifier": "relative", + "typescript.suggest.autoImports": true, + "typescript.updateImportsOnFileMove.enabled": "always", + "eslint.enable": true, + "eslint.autoFixOnSave": true, + "eslint.format.enable": true, + "eslint.lintTask.enable": true, + "files.eol": "\n", + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "emmet.includeLanguages": { + "typescript": "html" + } +} \ No newline at end of file diff --git a/packages/tpl-ts-web/template/jest.config.js b/packages/tpl-ts-web/template/jest.config.js new file mode 100644 index 0000000..d1b0552 --- /dev/null +++ b/packages/tpl-ts-web/template/jest.config.js @@ -0,0 +1,15 @@ +const path = require('path'); + +module.exports = { + preset: 'ts-jest', + testEnvironment: 'jsdom', + setupFilesAfterEnv: [path.join(__dirname, 'test/setup.js')], + collectCoverageFrom: [ + 'src/**/*.{ts,tsx}', + '!src/**/*.d.ts', + ], + testMatch: [ + '/test/**/*.test.{ts,tsx}' + ], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], +} \ No newline at end of file diff --git a/packages/tpl-ts-web/template/package.json b/packages/tpl-ts-web/template/package.json new file mode 100644 index 0000000..9b199de --- /dev/null +++ b/packages/tpl-ts-web/template/package.json @@ -0,0 +1,38 @@ +{ + "name": "project", + "version": "0.1.0", + "description": "TypeScript Web Library", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "dev": "webpack serve --mode=development", + "build": "webpack --mode=production && tsc --declaration --emitDeclarationOnly --outDir dist", + "build:dev": "webpack --mode=development", + "test": "jest", + "coverage": "jest --coverage", + "clean": "rm -rf node_modules/ package-lock.json dist", + "lint": "eslint src/**/*.ts", + "lint:fix": "eslint src/**/*.ts --fix" + }, + "devDependencies": { + "@types/node": "^18", + "@types/jest": "^29", + "@typescript-eslint/eslint-plugin": "^6", + "@typescript-eslint/parser": "^6", + "eslint": "^8", + "html-webpack-plugin": "^5", + "jest": "^29", + "ts-jest": "^29.1.2", + "ts-loader": "^9", + "typescript": "^5", + "webpack": "^5", + "webpack-cli": "^5", + "webpack-dev-server": "^4" + }, + "dependencies": {}, + "files": [ + "dist" + ], + "author": "echosoar", + "license": "MIT" +} \ No newline at end of file diff --git a/packages/tpl-ts-web/template/public/index.html b/packages/tpl-ts-web/template/public/index.html new file mode 100644 index 0000000..8c7e9a6 --- /dev/null +++ b/packages/tpl-ts-web/template/public/index.html @@ -0,0 +1,96 @@ + + + + + + <%= htmlWebpackPlugin.options.title %> + + + +

๐Ÿš€ TypeScript Web Library Demo

+

This is a live preview of your TypeScript library. The page will automatically reload when you make changes.

+ +
+

Library Demo

+

Test your library functions here:

+ +
+
+ +
+

Development Info

+
    +
  • ๐Ÿ”ฅ Hot Reload: Changes will be reflected automatically
  • +
  • ๐Ÿ“ Source Maps: Debug your TypeScript code directly
  • +
  • ๐Ÿงช Testing: Run npm test for unit tests
  • +
  • ๐Ÿ—๏ธ Build: Run npm run build for production
  • +
+
+ + + + \ No newline at end of file diff --git a/packages/tpl-ts-web/template/src/index.ts b/packages/tpl-ts-web/template/src/index.ts new file mode 100644 index 0000000..9ed7772 --- /dev/null +++ b/packages/tpl-ts-web/template/src/index.ts @@ -0,0 +1,59 @@ +/** + * A simple TypeScript web library template + */ + +export function hello(name: string): string { + return `Hello, ${name}! Welcome to your TypeScript web library.`; +} + +export function add(a: number, b: number): number { + return a + b; +} + +export function multiply(a: number, b: number): number { + return a * b; +} + +export class Calculator { + private result: number = 0; + + public add(value: number): Calculator { + this.result += value; + return this; + } + + public subtract(value: number): Calculator { + this.result -= value; + return this; + } + + public multiply(value: number): Calculator { + this.result *= value; + return this; + } + + public divide(value: number): Calculator { + if (value === 0) { + throw new Error('Cannot divide by zero'); + } + this.result /= value; + return this; + } + + public getResult(): number { + return this.result; + } + + public reset(): Calculator { + this.result = 0; + return this; + } +} + +// Export everything as default for UMD builds +export default { + hello, + add, + multiply, + Calculator, +}; \ No newline at end of file diff --git a/packages/tpl-ts-web/template/test/index.test.ts b/packages/tpl-ts-web/template/test/index.test.ts new file mode 100644 index 0000000..37f1d01 --- /dev/null +++ b/packages/tpl-ts-web/template/test/index.test.ts @@ -0,0 +1,65 @@ +import { hello, add, multiply, Calculator } from '../src/index'; + +describe('Library Functions', () => { + test('hello function should return greeting', () => { + expect(hello('World')).toBe('Hello, World! Welcome to your TypeScript web library.'); + }); + + test('add function should add two numbers', () => { + expect(add(2, 3)).toBe(5); + expect(add(-1, 1)).toBe(0); + expect(add(0, 0)).toBe(0); + }); + + test('multiply function should multiply two numbers', () => { + expect(multiply(2, 3)).toBe(6); + expect(multiply(-2, 3)).toBe(-6); + expect(multiply(0, 5)).toBe(0); + }); +}); + +describe('Calculator Class', () => { + let calculator: Calculator; + + beforeEach(() => { + calculator = new Calculator(); + }); + + test('should start with result 0', () => { + expect(calculator.getResult()).toBe(0); + }); + + test('should add numbers correctly', () => { + calculator.add(5).add(3); + expect(calculator.getResult()).toBe(8); + }); + + test('should subtract numbers correctly', () => { + calculator.add(10).subtract(3); + expect(calculator.getResult()).toBe(7); + }); + + test('should multiply numbers correctly', () => { + calculator.add(5).multiply(3); + expect(calculator.getResult()).toBe(15); + }); + + test('should divide numbers correctly', () => { + calculator.add(10).divide(2); + expect(calculator.getResult()).toBe(5); + }); + + test('should throw error when dividing by zero', () => { + expect(() => calculator.divide(0)).toThrow('Cannot divide by zero'); + }); + + test('should reset result to 0', () => { + calculator.add(5).multiply(3).reset(); + expect(calculator.getResult()).toBe(0); + }); + + test('should chain operations', () => { + const result = calculator.add(10).subtract(2).multiply(3).divide(4).getResult(); + expect(result).toBe(6); + }); +}); \ No newline at end of file diff --git a/packages/tpl-ts-web/template/test/setup.js b/packages/tpl-ts-web/template/test/setup.js new file mode 100644 index 0000000..3f1712b --- /dev/null +++ b/packages/tpl-ts-web/template/test/setup.js @@ -0,0 +1,2 @@ +// Test setup file +// Add any global test setup here \ No newline at end of file diff --git a/packages/tpl-ts-web/template/tsconfig.json b/packages/tpl-ts-web/template/tsconfig.json new file mode 100644 index 0000000..d7ee315 --- /dev/null +++ b/packages/tpl-ts-web/template/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "lib": ["ES2020", "DOM"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules", + "dist", + "test" + ] +} \ No newline at end of file diff --git a/packages/tpl-ts-web/template/webpack.config.js b/packages/tpl-ts-web/template/webpack.config.js new file mode 100644 index 0000000..77cde2b --- /dev/null +++ b/packages/tpl-ts-web/template/webpack.config.js @@ -0,0 +1,48 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); + +module.exports = (env, argv) => { + const isProduction = argv.mode === 'production'; + + return { + entry: './src/index.ts', + output: { + path: path.resolve(__dirname, 'dist'), + filename: isProduction ? '[name].[contenthash].js' : '[name].js', + library: { + name: 'MyLibrary', + type: 'umd', + }, + clean: true, + }, + resolve: { + extensions: ['.ts', '.js'], + }, + module: { + rules: [ + { + test: /\.ts$/, + use: 'ts-loader', + exclude: /node_modules/, + }, + ], + }, + plugins: [ + new HtmlWebpackPlugin({ + template: './public/index.html', + title: 'TypeScript Web Library Demo', + }), + ], + devServer: { + static: { + directory: path.join(__dirname, 'public'), + }, + hot: true, + open: true, + port: 3000, + compress: true, + historyApiFallback: true, + }, + devtool: isProduction ? 'source-map' : 'eval-source-map', + }; +}; \ No newline at end of file